iPadOS 15 – WOOHOO!!

iPadOS15 is here! This is my most favourite update to the iPad so far!

I’ve been using iPadOS 15 for the past 2 days, and ITS AMAZING!

A year ago, I made a post about iPadOS 14, and how some features were there on iPhone but wasn’t on iPad, and I think iPadOS 15 got them in!

Download Times

The downloading took around 15 minutes at 30 mbps, with 3.28 gigabytes. The installing also took 15 minutes, with a total 30 minutes.

New things

Starting with the home screen. Now that widgets can be on the Home Screen, it looks much cooler. One bad thing about it is that the icon space has become smaller, but it wasn’t that noticeable. Yes, I have the MacOS Monterey wallpaper on, but that’s because I don’t like the new wallpaper. This is the beta though, so they may add some more close to the GM Release.

I really like the new EXTRA LARGE widgets, especially the Game Center one. The empty widget is the Contacts widget, and I censored it. That’s the same for the weather location widget.

The Translate app is also here, with a new Face-to-Face feature.

The new Apple Maps custom 3D models are really cool, and look so nice!

This is one of my favourite new features, the App Library. I really like that it’s on the Dock, and the animation looks really nice.

The new Safari design looks AWESOME!

These were my favourite features, but I also liked Quick Notes, Focus, and everything else!

That’s all for this post. See you later!

iPadOS 14 Beta – 3 good and bad things

I got the iPadOS 14 Beta just the day after WWDC20 and this is the review after one month. I started downloading it at around 7:52 am on June 23rd. The download completed only at around 11:30 am, which is longer than most updates. The installation time was way shorter, for around 15-20 mins.

The front home screen of iPadOS 14

Good things:

1. There is a more compact design for Siri, FaceTime calls, and the search bar.

The new Siri design on the bottom-right corner.

2. Messages has a group photo option, and Memoji now has more age options, hairstyles, hats, and face masks! You also have the option to pin comments at the top, which looks really nice. However, you are only allowed to pin up to 9 people. It would look nice if you had the ability to pin more or all people.

3. Scribble is a feature where you can use an Apple Pencil to write instead of type, and automatically converts it to text.

Scribble on iPadOS

1. The app library is not there on iPadOS 14 like there is on iOS 14, but this is a Developer Beta version, so they might add it later.

Bad Things

The App Library on iOS 14

2. Widgets can’t move to the home screen like on iOS 14. They only remain on the side of the home screen.

3. The Translate App, a feature that was newly introduced by Apple on iOS 14, is not available for iPadOS.

The screen of the Translate App

Other than these 3 things, iPadOS 14 is really good. When Apple releases the official version, I think it will be much better. Thanks for reading my post!


iPad Generation 2 Teardown:Lockdown Edition!

Hello! About a day ago I found my first iPad, a generation 2. In this post, I’m going to be opening it up!(it has a TON of pictures!)

So this model is a 64GB one, and this is actually the first iPad to have a dual-core processor.

The iPad Gen-2
Now, the outer screen has been removed
The main screen has been removed.

Towards, the bottom of the iPad, there are some metal coverings. I removed them up, and:

Now we can see 16GB of flash memory, an Apple A5 chip, and a gazillion transistors. Above that, there are 3 3.8V 25 Whr lithium-ion batteries.

I also found this mysterious part. Can someone tell me what this is?
On the left, you can see the SIM card slot.

Now, let’s move to the camera.

This is a 0.7 MP camera.
I also opened up the buttons.

I know this is a short post but thanks for reading!

Jump!, a game I made

I made a game with my Arduino, called jump! It has a 2 x 16 LCD Display, so the screen is a little small.

Here’s how it looks. I added a case and a stand for the controller.(the controller is optional) Here, I’m just going to show you the basic structure

Stuff you need:

  • An Arduino Uno
  • Some jumper wires
  • A 220 Ω resistor
  • A 2 x 16 LCD Display
  • A breadboard
  • A push button

An LCD Display has a lot of connections:

These pins are (from left to right):

  • GND – power ground signal
  • VCC – positive power signal
  • V0 – contrast adjust
  • RS – register select
  • R/W – read/write select
  • E – operation enable signal
  • DB0 – data bit 0 (not used here)
  • DB1 – data bit 1 (not used here)
  • DB2 – data bit 2 (not used here)
  • DB3 – data bit 3 (not used here)
  • DB4 – data bit 4
  • DB5 – data bit 5
  • DB6 – data bit 6
  • DB7 – data bit 7
  • LED+ – backlight LED positive
  • LED- – backlight LED negative

Using short hookup wires, connect GND and LED- (1 and 16) to the black row at the side of the breadboard

Then, connect VCC (pin 2) to the red row at the side of the breadboard

Bend the wire leads of the 220 Ω resistor and connect it between LED+ and the red row at the side of the breadboard.

Now, do these connections

  • Connect DB7 to Arduino digital pin 3
  • Connect DB6 to Arduino digital pin 4
  • Connect DB5 to Arduino digital pin 5
  • Connect DB4 to Arduino digital pin 6
  • Connect E to Arduino digital pin 9
  • Connect R/W to Arduino digital pin 10
  • Connect RS to Arduino digital pin 11
  • Connect V0 to Arduino digital pin 12

Plug the push button between the center of the breadboard, connecting both the sides. Connect one of the top two pins of the button to the black row at the side of the breadboard. Connect the other pin next to the pin you just plugged in to digital pin 2 of the Arduino.

Or, you can follow this schematic:

Now, for the code:

#include

#define PIN_BUTTON 2
#define PIN_AUTOPLAY 1
#define PIN_READWRITE 10
#define PIN_CONTRAST 12

#define SPRITE_RUN1 1
#define SPRITE_RUN2 2
#define SPRITE_JUMP 3
#define SPRITE_JUMP_UPPER ‘.’ // Use the ‘.’ character for the head
#define SPRITE_JUMP_LOWER 4
#define SPRITE_TERRAIN_EMPTY ‘ ‘ // User the ‘ ‘ character
#define SPRITE_TERRAIN_SOLID 5
#define SPRITE_TERRAIN_SOLID_RIGHT 6
#define SPRITE_TERRAIN_SOLID_LEFT 7

#define HERO_HORIZONTAL_POSITION 1 // Horizontal position of hero on screen

#define TERRAIN_WIDTH 16
#define TERRAIN_EMPTY 0
#define TERRAIN_LOWER_BLOCK 1
#define TERRAIN_UPPER_BLOCK 2

#define HERO_POSITION_OFF 0 // Hero is invisible
#define HERO_POSITION_RUN_LOWER_1 1 // Hero is running on lower row (pose 1)
#define HERO_POSITION_RUN_LOWER_2 2 // (pose 2)

#define HERO_POSITION_JUMP_1 3 // Starting a jump
#define HERO_POSITION_JUMP_2 4 // Half-way up
#define HERO_POSITION_JUMP_3 5 // Jump is on upper row
#define HERO_POSITION_JUMP_4 6 // Jump is on upper row
#define HERO_POSITION_JUMP_5 7 // Jump is on upper row
#define HERO_POSITION_JUMP_6 8 // Jump is on upper row
#define HERO_POSITION_JUMP_7 9 // Half-way down
#define HERO_POSITION_JUMP_8 10 // About to land

#define HERO_POSITION_RUN_UPPER_1 11 // Hero is running on upper row (pose 1)
#define HERO_POSITION_RUN_UPPER_2 12 // (pose 2)

LiquidCrystal lcd(11, 9, 6, 5, 4, 3);
static char terrainUpper[TERRAIN_WIDTH + 1];
static char terrainLower[TERRAIN_WIDTH + 1];
static bool buttonPushed = false;

void initializeGraphics(){
static byte graphics[] = {
// Run position 1
B01100,
B01100,
B00000,
B01110,
B11100,
B01100,
B11010,
B10011,
// Run position 2
B01100,
B01100,
B00000,
B01100,
B01100,
B01100,
B01100,
B01110,
// Jump
B01100,
B01100,
B00000,
B11110,
B01101,
B11111,
B10000,
B00000,
// Jump lower
B11110,
B01101,
B11111,
B10000,
B00000,
B00000,
B00000,
B00000,
// Ground
B11111,
B11111,
B11111,
B11111,
B11111,
B11111,
B11111,
B11111,
// Ground right
B00011,
B00011,
B00011,
B00011,
B00011,
B00011,
B00011,
B00011,
// Ground left
B11000,
B11000,
B11000,
B11000,
B11000,
B11000,
B11000,
B11000,
};
int i;
// Skip using character 0, this allows lcd.print() to be used to
// quickly draw multiple characters
for (i = 0; i < 7; ++i) {
lcd.createChar(i + 1, &graphics[i * 8]);
}
for (i = 0; i < TERRAIN_WIDTH; ++i) {
terrainUpper[i] = SPRITE_TERRAIN_EMPTY;
terrainLower[i] = SPRITE_TERRAIN_EMPTY;
}
}

// Slide the terrain to the left in half-character increments
//
void advanceTerrain(char* terrain, byte newTerrain){
for (int i = 0; i 9999) ? 5 : (score > 999) ? 4 : (score > 99) ? 3 : (score > 9) ? 2 : 1;

// Draw the scene
terrainUpper[TERRAIN_WIDTH] = ‘\0’;
terrainLower[TERRAIN_WIDTH] = ‘\0’;
char temp = terrainUpper[16-digits];
terrainUpper[16-digits] = ‘\0’;
lcd.setCursor(0,0);
lcd.print(terrainUpper);
terrainUpper[16-digits] = temp;
lcd.setCursor(0,1);
lcd.print(terrainLower);

lcd.setCursor(16 – digits,0);
lcd.print(score);

terrainUpper[HERO_HORIZONTAL_POSITION] = upperSave;
terrainLower[HERO_HORIZONTAL_POSITION] = lowerSave;
return collide;
}

// Handle the button push as an interrupt
void buttonPush() {
buttonPushed = true;
}

void setup(){
pinMode(PIN_READWRITE, OUTPUT);
digitalWrite(PIN_READWRITE, LOW);
pinMode(PIN_CONTRAST, OUTPUT);
digitalWrite(PIN_CONTRAST, LOW);
pinMode(PIN_BUTTON, INPUT);
digitalWrite(PIN_BUTTON, HIGH);
pinMode(PIN_AUTOPLAY, OUTPUT);
digitalWrite(PIN_AUTOPLAY, HIGH);

// Digital pin 2 maps to interrupt 0
attachInterrupt(0/*PIN_BUTTON*/, buttonPush, FALLING);

initializeGraphics();

lcd.begin(16, 2);
}

void loop(){
static byte heroPos = HERO_POSITION_RUN_LOWER_1;
static byte newTerrainType = TERRAIN_EMPTY;
static byte newTerrainDuration = 1;
static bool playing = false;
static bool blink = false;
static unsigned int distance = 0;

if (!playing) {
drawHero((blink) ? HERO_POSITION_OFF : heroPos, terrainUpper, terrainLower, distance >> 3);
if (blink) {
lcd.setCursor(0,0);
lcd.print(“Press Start”);
}
delay(250);
blink = !blink;
if (buttonPushed) {
initializeGraphics();
heroPos = HERO_POSITION_RUN_LOWER_1;
playing = true;
buttonPushed = false;
distance = 0;
}
return;
}

// Shift the terrain to the left
advanceTerrain(terrainLower, newTerrainType == TERRAIN_LOWER_BLOCK ? SPRITE_TERRAIN_SOLID : SPRITE_TERRAIN_EMPTY);
advanceTerrain(terrainUpper, newTerrainType == TERRAIN_UPPER_BLOCK ? SPRITE_TERRAIN_SOLID : SPRITE_TERRAIN_EMPTY);

// Make new terrain to enter on the right
if (–newTerrainDuration == 0) {
if (newTerrainType == TERRAIN_EMPTY) {
newTerrainType = (random(3) == 0) ? TERRAIN_UPPER_BLOCK : TERRAIN_LOWER_BLOCK;
newTerrainDuration = 2 + random(10);
} else {
newTerrainType = TERRAIN_EMPTY;
newTerrainDuration = 10 + random(10);
}
}

if (buttonPushed) {
if (heroPos > 3)) {
playing = false; // The hero collided with something. Too bad.
} else {
if (heroPos == HERO_POSITION_RUN_LOWER_2 || heroPos == HERO_POSITION_JUMP_8) {
heroPos = HERO_POSITION_RUN_LOWER_1;
} else if ((heroPos >= HERO_POSITION_JUMP_3 && heroPos = HERO_POSITION_RUN_UPPER_1 && terrainLower[HERO_HORIZONTAL_POSITION] == SPRITE_TERRAIN_EMPTY) {
heroPos = HERO_POSITION_JUMP_5;
} else if (heroPos == HERO_POSITION_RUN_UPPER_2) {
heroPos = HERO_POSITION_RUN_UPPER_1;
} else {
++heroPos;
}
++distance;

digitalWrite(PIN_AUTOPLAY, terrainLower[HERO_HORIZONTAL_POSITION + 2] == SPRITE_TERRAIN_EMPTY ? HIGH : LOW);
}
delay(100);
}

Thanks for reading this page!

The byte guide

Good morning/afternoon/evening/night!

Welcome to the universe of digital storage. I am your byte guide, Nibble (8 bits). I will guide you through this place. Here are all the places we are visiting

  • Bit
  • Byte
  • Kilobyte
  • Megabyte
  • Gigabyte
  • Terabyte
  • Petabyte
  • Exabyte
  • Zettabyte
  • Yottabyte
  • Brontobyte 

and 

  • Geopbyte

What is a bit?

A bit is the smallest you can possibly store things in. It is equal to 0.125 bytes

What is a byte?

A byte is the like the gram or litre of digital storage. It is equal to 1 byte.

What is a Kilobyte?

A kilobyte is a little more than a byte. It is equal to 1024 bytes

What is a Megabyte?

A megabyte is equal to 1024 kilobytes. In 2005, MicroSD cards stored only 128 megabytes, which could store around two or three .mp3 files, while MicroSD cards today can store 128 gigabytes!

What is a Gigabyte?

A Gigabyte is a commonly used unit of digital storage. Mobile devices generally use around 32-256 gigabytes(currently. If you were living in 2050, it might store a few petabytes). It is equal to 1024 Megabytes.

What is a Terabyte?

A notebook (not THAT notebook, the computer notebook) typically has around a terabyte of storage. It is equal to 1024 gigabytes.

What is a Petabyte?

A petabyte is a LOT of storage space. It is equal to 1024 terabytes.

Now we get to the HUMONGOUS ones.

What is an Exabyte?

An exabyte is equal to 1024 petabytes(a few molecules are wobbling)

What is a Zettabyte?

A zettabyte is equal to 1024 exabytes(my head is spinning!)

What is a Yottabyte?

A yottabyte is equal to 1024 zettabytes( The earth is bashing into every planet!)

What is a Brontobyte?

A brontobyte is equal to 1024 yottabytes(The universe is being smashed into smithereens!)

What is a geopbyte?

A geopbyte is equal to 1024 brontobytes(aaaah!!! *black*)

Singapore Shots

About a month ago, I went on a trip for a week to Singapore. We stayed in a hotel called Days Hotel. We visited Universal Studios, Little India, Singapore Zoo, Orchard Road, The Merlion, Singapore Flyer, gardens by the bay, and a lot more.

I made a short 1 minute video with pictures of plants in Gardens By the Bay and the views of Singapore from the Singapore Flyer

Some other photos:

The Merlion

Marina Bay Sands

The Artificial Supertree Groves where there is an amazing light show at night

The apartments and buildings outside our hotel window

Scratch Game:Pathways

Scratch is a programming language by The MIT University. It uses blocks that connect together like Lego to code sprites(characters) and create programs,games and animations. I made a game in Scratch. It is called Pathways. It uses the Arrow keys to go through a path. Touch the purple line and you’ll lose. After you get out press the space key to start again. I have only made 2 levels. You can build on it. The only hard thing is that at level 2, if you lose and press the space key, you have to start from level 1! Click here to see my game.

How to make a Line following robot

A line following robot follows a line using two sensors called IR sensors. The robots are used in hotels for serving food, at factories for taking material in and out of the warehouse, or for just playing around with it.

How does an IR sensor work?

Slide2The IR LED reflects infrared light onto the surface. If the light reflects back to the Photo Diode, there is no white line and the motors will go everywhere trying to find a line. If it doesn’t reflect back, that means there is a line and the motors move forward and the whole process starts again (quickly, not slowly).

Ingredients for the robot

  • L293D Motor driver Shield
  • An Arduino UNO
  • 6 male to female wires
  • 2 IR proximity sensors
  • Power source. Not 9v batteries. (A power bank should do)
  • 2wd chassis (if you have two caster wheels, use just one at the back).

Building the Robot

  1. Build the chassis. There should be instructions in the box. If not, screw all the parts. The top of the gear motor is negative and the bottom positive. If it doesn’t work, turn the wires the other way round.
  2. Copy the schematics as given here. 

However, you need not connect the LEDs as shown in the diagram.

3. Copy the code to the Arduino web editor or download Arduino IDE. You will need to sign up if you are using the web editor. After you have uploaded to the Arduino, test it on a white line on a black surface and if it works, you’ve finished!