Akhil Joseph

Akhil

Output devices

Generic placeholder image
Akhil Joseph

Fab Accadamy 2019

January 20, 2019

Output devices

So it's the 12th week since I begin my fab journey. In this week, I got following assignments,

  • Add an output device to a microcontroller board you've designed, and program it to do something
  • Measure the power consumption of an output device

Actualy I have some previous Experience in OLED displays, I love it verymuch. That is the main reason to chose this. Its very cool display. And i also plan to Build one PCB for my final project. So in this week I design a PCB with 6 PWM Servo pins, And one i2c port. And also have a FTDI pin header.

so This week I includes the following In my PCB

  • Rotary Encoder
  • Oled Display
  • 6 PWM Servo connectors
  • FTDi Deader
  • one Status LED


OLED Display
×

These displays are small, only about 1" diagonal, but very readable due to the high contrast of an OLED display. This display is made of 128x64 individual white OLED pixels, each one is turned on or off by the controller chip. Because the display makes its own light, no backlight is required. This reduces the power required to run the OLED and is why the display has such high contrast; we really like this miniature display for its crispness!

×

SSD1306 0.96" OLED Display Pinout

×

This Display use SSD1306 Chip. This is a snall chip, which can be used in OLED displays. Mostof the displays avialable in market use either SPI communication or I2C communication. In heare i use I2c communication. To do this i use 2 Hardware i2c pins SCL, SDA

I2c Protocal

An I2C protocol is one of the serial communication protocol that is used for the chip to chip communication. Similar to the I2C protocol, SPI and UART also used for the chip to chip communication. The I2C is the short form of Inter-Integrated Circuit, is a type of bus, which designed and developed by Philips in 1980 for inter-chip communication.I2C is adopted by a lot of vendor companies for the chip to chip communication. It is a multi-master and multi-slave serial communication protocol means that we have the freedom to attach multiple IC at a time with the same bus. In I2C protocol, communication always started by the master and in the case of multi-master, only one master has the ownership of the bus.

×

I2C is basically two-wire communication protocol.It uses only two wire for the communication. In which one wire is used for the data (SDA) and other wire is used for the clock (SCL). In I2C, both buses are bidirectional, which means master able to send and receive the data from the slave. The clock bus is controlled by the master but in some situations slave is also able to suppress the clock signal, Unlike the serial com port I2c is the synchronous communication, in I2C both master and slave use the shared clock which is produced by the master. In serial port, both the transmitter and receiver device have own clock generator. Hence it is very important to minimize the difference between the clock of the transmitter and slave otherwise data will be corrupt during the communication.

×

In I2c before the performing, the write operation master has to assert a start condition on I2c bus with the slave’s address and write control bit (for write operation control bit will be 0). If the transmitted address match with any slave which connected to the I2C bus then master receives an acknowledge bit. After getting the ACK bit master send the address of the register, where it wishes to write, the slave will acknowledge again, letting the master know it is ready for the write operation. After getting this acknowledgment, the master will start sending the data to the slave. Master will get the acknowledgment of each transmitted byte of data. If the master does not get the acknowledgment from the slave then master assert a stop condition to stop the communication or either assert the repeated start to establish a new communication. There or another option to stop the communication when the master has sent all the data than the master is terminated the transmission with a STOP condition.

I2c Read operation same as the I2C write operation, In which master asserts the start condition before the read operation. After the start condition master transmit the slave address with Read control bit (for read operation control bit will be 1), if the transmitted address match with any device in the I2c bus then it acknowledges to the master to pulling down the data bus(SDA). After getting ACK bit, master release the data bus but continue sending the clock pulse, in that situation master become receiver and slave become the slave transmitter. In the read operation, the master gives the acknowledgment to the slave on the receiving of every byte of data to let the slave know that it is ready for more data. Once the master has received the number of bytes which it is expecting, it will send a NACK bit to release the bus and assert the stop bit to halt the communication.


PCB Design

Heare i use Proteus 8.0 profesional to design my PCB. I have some work Experence in PCB designing. And i also a freelance PCB designer. so this is not a task for me.

×

In my PCB there are following components

  • Atmegte328p
  • Rotary Encoder
  • Oled Display
  • 6 PWM Servo connectors
  • FTDi Deader
  • one Status LED

×

×

Download proteus PCB design files
PCB Milling

You can refer my Electronics Production week to learn, how to use modella to mill PCB


preparing BIT MAPS

In hardware we need to put image as bitmaps. this is set of numbers represent each and every pixes in LCD. i use photoshop to make FAB logo as bitmap.

×

This is very low resolution because the display is very low resolution. (only 72 ppi) Then convert it to bitmap

×

now we got the image which can be displayed on th OLED

×

Now we need to convert to HEX code. for this i use a small softwere called LCDAssist. this will convert the bmp images to HEX code, which controler can read.

Download Bitmap to HEX converter

×

then we need to save it to a text file. we can find the following HEX if we open that text file

×

Copy the entire HEX file and paste it as a charactor array in arduino code


Embedded Programing

                            #include <Wire.h>
                            #include <AKHILCD.h>
                            #include <Arduino.h>
                            LCD_SSD1306 lcd;
                            
                            #define outputA A1
                            #define outputB A0
                            #define butt A2
                            
                            
                            int counter = 0;
                            int aState;
                            int aLastState;
                            int flag = 1;
                            
                            unsigned long lastDebounceTime = 0;  
                            unsigned long debounceDelay = 50;
                            int ledState = HIGH;        
                            int buttonState;             
                            int lastButtonState = LOW;
                            const int buttonPin = 0;    
                            const int ledPin = 7;
                            const PROGMEM uint8_t Fab_logo[128*64/8] = {
                            0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
                            0x80, 0x80, 0x80, 0xC0, 0xC0, 0xE0, 0xE0, 0xE0, 0xE0, 0xF0, 0xF0, 0xF0, 0x70, 0x30, 0x70, 0x70,
                            0xF0, 0xF0, 0xE0, 0xF0, 0xE0, 0xE0, 0xC0, 0xC0, 0xC0, 0xC0, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00,
                            0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
                            0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
                            0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
                            0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
                            0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
                            0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0xC0, 0xF0, 0xF0, 0xFC, 0xFC, 0x7E, 0x7F,
                            0x7F, 0x7F, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xF9, 0xF1, 0xF0, 0xF0, 0xF0, 0xF0, 0xF0, 0xF0,
                            0xF0, 0xF0, 0xE1, 0xE3, 0xC3, 0xC7, 0x07, 0x0F, 0x0F, 0x1F, 0x3F, 0x3F, 0x7F, 0x7E, 0xFC, 0xFC,
                            0xF8, 0xF0, 0xC0, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
                            0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
                            0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
                            0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
                            0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
                            0x00, 0x00, 0x00, 0x00, 0xC0, 0xF0, 0xFC, 0xF9, 0xF3, 0x03, 0x01, 0x01, 0x00, 0x00, 0x00, 0x00,
                            0x00, 0x00, 0x00, 0x00, 0x1F, 0x3F, 0x7F, 0x7F, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
                            0xFF, 0xFF, 0xFF, 0x7F, 0x7F, 0x1F, 0x0F, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
                            0x01, 0x03, 0x03, 0xDB, 0xF9, 0xF8, 0xF0, 0xC0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
                            0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
                            0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
                            0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
                            0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
                            0x00, 0x00, 0x00, 0xFC, 0xFF, 0xFF, 0xFF, 0xFF, 0xED, 0x00, 0x00, 0x00, 0x80, 0xC0, 0xE0, 0xE0,
                            0xF0, 0xF0, 0xE0, 0xE0, 0xE0, 0xC0, 0x80, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x01, 0x01, 0x00,
                            0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0xC0, 0xE0, 0xE0, 0xF0, 0xF0, 0xF0, 0xF0, 0xE0, 0xE0, 0xE0,
                            0xE0, 0xF0, 0xF0, 0xFD, 0xFF, 0xFF, 0xFF, 0xFF, 0xFA, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
                            0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
                            0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
                            0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
                            0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
                            0x00, 0x00, 0x00, 0x15, 0x7F, 0xFF, 0xFF, 0xFF, 0xDD, 0x00, 0x00, 0x00, 0x1F, 0xFF, 0xFF, 0xFF,
                            0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFE, 0xFC, 0xA0, 0x00, 0x00, 0x00, 0x00, 0x00,
                            0x00, 0x00, 0xF0, 0xFC, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x3F,
                            0x1F, 0x0F, 0x0F, 0x2F, 0xFF, 0xFF, 0xFF, 0xFF, 0x0F, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
                            0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
                            0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
                            0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
                            0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
                            0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0x0F, 0x3F, 0x7E, 0xF0, 0xF0, 0xE0, 0xE0, 0xC0, 0x81, 0xDF,
                            0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x7F, 0x1F, 0x0F, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00,
                            0x00, 0x00, 0x07, 0x1F, 0x1F, 0x3F, 0x3F, 0x3F, 0x3F, 0x1F, 0x1F, 0x0F, 0x8F, 0x83, 0xC0, 0xC0,
                            0xE0, 0xE0, 0xF0, 0x7D, 0x7F, 0x0F, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
                            0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
                            0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
                            0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
                            0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
                            0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0x07, 0x0F, 0x0F, 0x1F, 0x3F,
                            0x7F, 0x7F, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFD, 0xE0, 0xE0, 0xC0, 0xC0, 0x80, 0x00, 0x00, 0x80,
                            0xC0, 0xC0, 0xE0, 0xE0, 0xF0, 0xF0, 0xF8, 0xFC, 0xFC, 0x7E, 0xFE, 0x3F, 0x3F, 0x1F, 0x1F, 0x07,
                            0x07, 0x03, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
                            0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
                            0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
                            0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
                            0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
                            0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
                            0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x01, 0x01, 0x03, 0x03, 0x03, 0x03, 0x03, 0x00, 0x00, 0x03,
                            0x03, 0x03, 0x03, 0x03, 0x01, 0x01, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
                            0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
                            0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
                            0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
                            0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
                            0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00};
                            
                            void setup() {
                              
                              pinMode (outputA, INPUT);
                              pinMode (outputB, INPUT);
                              pinMode (butt, INPUT);
                              lcd.begin();
                              Serial.begin(9600);
                              Serial.print("Test");
                              lcd.clear();
                              lcd.setCursor(0, 0);
                              lcd.draw(Fab_logo, 128, 64);
                              lcd.setCursor(65, 2);
                              lcd.setFontSize(FONT_SIZE_XLARGE);
                              lcd.println("FABLAB");
                              lcd.setCursor(65, 4);
                              lcd.setFontSize(FONT_SIZE_XLARGE);
                              lcd.println("KOCHI");
                              
                              delay(1000);
                              
                              aLastState = digitalRead(outputA);
                            }
                            
                            void loop() {
                              aState = digitalRead(outputA); 
                              //switc();
                              if (aState != aLastState) {
                                if (digitalRead(outputB) != aState) {
                                  counter++;
                                } else {
                                  counter --;
                                }
                            
                                if (counter > 255)
                                  counter = 255;
                                if (counter < 0)
                                  counter = 0;
                                 Serial.print("Position: ");
                                 Serial.println(counter);
                                 lcd.clear();
                                 lcd.setCursor(50, 2);
                                 lcd.setFontSize(FONT_SIZE_XLARGE);
                                 lcd.printLong(counter);
                              }
                              aLastState = aState; // Updates th
                            }
                            
                            void switc()
                            {
                              int reading = digitalRead(buttonPin);
                              if (reading != lastButtonState)
                              {
                                lastDebounceTime = millis();
                              }
                            
                              if ((millis() - lastDebounceTime) > debounceDelay)
                                if (reading != buttonState) {
                                  buttonState = reading;
                            
                            
                                  if (buttonState == LOW) {
                                    ledState = !ledState;
                                  }
                                }
                              lastButtonState = reading;
                            }
                            
                            
                            

Download Arduino source code Download My AKHILCD Library

My arduino library cammands

  • LCD_SSD1306 lcd; create an object called lcd
  • lcd.begin();this cammand initilize Display
  • lcd.clear();This cammand clear the display
  • lcd.setCursor(0, 0);This command moves the courser to the location given
  • lcd.draw(Fab_logo, 128, 64);This will drow the bitmap array in oled display
  • lcd.setFontSize(FONT_SIZE_XLARGE);this set the fount size
  • lcd.println("FABLAB");this prints FABLABon the display


Finalany made it!

×

Somthing Interesting...!!


Group Assignments

Measure the power consumption of an output device

Electric power is the rate, per unit time, at which electrical energy is transferred by an electric circuit. The SI unit of power is the watt (W), one joule per second. For calculating the consumed power, We must know it's

  • Voltage
  • Current
  • Resistance
×

Mesuring Power

As you can see in the above equation, we need to find out the variables. For that we need to test for following using a multimeter

Voltage
×

The voltage is calculated by connecting parallel to the "Load". Here Units of Voltage is "Volt(V)"

Current
×

The Current is calculated by connecting series to the "Load".Here Units of Current is "Ampere(A)"

Resistance
×

The Resistance is calculated by connecting parallel to the "Load"Here Units of Resistance is "Ohm(Ω)" So we used a multimeter to find out the variables..

×

So here we got:

  • Voltage=5V
  • Current=8μA

Substitute values in the equation:p=VI

We got power of the output device is "40μW"

By repeating the process and we can find other output devices power consumption...

Generic placeholder image
NEXT WEEK

project management

January 20, 2019