Differences

This shows you the differences between two versions of the page.

Link to this comparison view

projects:esp [2015/02/04 18:16]
darron [24LC512]
projects:esp [2017/01/12 22:44]
Line 1: Line 1:
-==== Extrasensory perception for ESP-01 & RPi ==== 
-<wrap right> 
-{{:projects:espwip.jpg?200|RPi B+}} 
-\\ \\ 
-{{:projects:espi2c.jpg?200|ESP-01}} 
-</wrap> 
  
-This project adds three I2C devices to an [[:boards:esp8266|ESP-01]] or a [[:boards:rpi|Raspberry Pi]]. 
- 
-The three devices are a Microchip MCP23016 digital I/O expander, NXP PCF8591 ADC/DAC and Microchip 24LC512 EEPROM. 
- 
-These were chosen because they add useful capabilities to the ESP-01 or RPi and all three are available in DIP format from CPC in the United Kingdom. 
- 
-=== Schematic === 
- 
-{{:projects:esp.png?200}} 
- 
-=== I2C bus === 
- 
-^Address ^Device | 
-|0x20    |MCP23016| 
-|0x48    |PCF8591| 
-|0x50    |24LC512| 
- 
-Probing the bus on the RPi with [[:tools:i2ctools|I2C Tools]] should reveal the following. 
-<code> 
-i2cdetect -y 1 
-      1  2  3  4  5  6  7  8  9  a  b  c  d  e  f 
-00:          -- -- -- -- -- -- -- -- -- -- -- -- --  
-10: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --  
-20: 20 -- -- -- -- -- -- -- -- -- -- -- -- -- -- --  
-30: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --  
-40: -- -- -- -- -- -- -- -- 48 -- -- -- -- -- -- --  
-50: 50 -- -- -- -- -- -- -- -- -- -- -- -- -- -- --  
-60: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --  
-70: -- -- -- -- -- -- -- --  
-</code> 
-=== MCP23016 === 
- 
-^Control ^Register ^Function | 
-|0       |GP0|     GPO input | 
-|1       |GP1|     GP1 input | 
-|2       |OLAT0|   GP0 output | 
-|3       |OLAT1|   GP1 output | 
-|6       |IODIR0|  GP0 direction | 
-|7       |IODIR1|  GP1 direction | 
- 
-To use the MCP23016 first set the GPIO direction register. Microchip use 1 for input and 0 for output. After that you can either read the input register or write to the output register. 
- 
-== ESP-01 NodeMcu == 
- 
-First we need eSPY, fetch and build it. The examples below come with the source. 
-<code> 
-hg clone http://hg.kewl.org/pub/espy 
-cd epsy 
-make 
-</code> 
- 
-This example script blinks an LED attached to the MCP23016 GP0.0 pin. 
-<code> 
-#!espy /dev/ttyUSB0 
- 
--- pin 3 = GPIO0 
-sda=3 
- 
--- pin 4 = GPIO2 
-scl=4 
- 
--- init I2C 
-i2c.setup(0,sda,scl,i2c.SLOW) 
- 
--- write MCP 
-function write_mcp(control,value) 
-        i2c.start(0) 
-        i2c.address(0,0x20,i2c.TRANSMITTER) 
-        i2c.write(0,control) 
-        i2c.write(0,value) 
-        i2c.stop(0) 
-end 
- 
--- init GP0.0 
-write_mcp(2,0) 
-write_mcp(6,0xFE) 
- 
--- blink LED on GP0.0 3 times 
-for i = 1, 3, 1 do 
-        write_mcp(2,1) 
-        print ("on") 
-        tmr.delay(1000000) 
-        write_mcp(2,0) 
-        print ("off") 
-        tmr.delay(1000000) 
-end 
-</code> 
- 
-The script comes with the eSPY application and can be demomstrated thus. 
-<code> 
-./mcp.esp 
-off 
-on 
-off 
-on 
-off 
-</code> 
- 
-== RPi == 
- 
-[[:tools:i2ctools|I2C Tools]] on the RPi are used to demonstrate the MCP23016 GPIO. 
- 
-Here we clear the output latch, set GP0.0 to an output, then set the pin high on the RPi. 
-<code> 
-i2cset -y 1 0x20 2 0 
-i2cset -y 1 0x20 6 0xFE 
-i2cset -y 1 0x20 2 1 
-</code> 
- 
-Now on the RPi we set GP1.0 as an input then read it twice. The first read is with GP1.0 taken 
-low and the second read with GP1.0 taken high. 
-<code> 
-i2cset -y 1 0x20 7 1 
-i2cget -y 1 0x20 1 
-0xde 
-i2cget -y 1 0x20 1 
-0xdf 
-</code> 
- 
-Please refer to the [[#resources|data-sheet]] for full information for this part. 
- 
-=== PCF8591 === 
-^Control ^Register   ^Function | 
-|0        | channel 0 |Read ADC 0| 
-|1        | channel 1 |Read ADC 1| 
-|2        | channel 2 |Read ADC 2| 
-|3        | channel 3 |Read ADC 3| 
-|+64      | analog OE |DAC output| 
- 
-To write to the DAC, we set the control to 64 and write a value between 0 and 255 which represents 0 to VREF volts on the output pin. 
- 
-To read from an ADC, we first send a control representing the channel, then we perform two reads. The first read starts the conversion process and the second read fetches the result (this also starts another conversion). 
- 
-If we are using the DAC, then we must also set the analog OE bit else the DAC will be disabled. 
- 
-== ESP-01 NodeMcu == 
- 
-A simple ramp demo can be achieved like this with NodeMcu on the ESP-01. 
-<code> 
-#!espy /dev/ttyUSB0 
- 
--- pin 3 = GPIO0 
-sda=3 
- 
--- pin 4 = GPIO2 
-scl=4 
- 
--- init I2C 
-i2c.setup(0,sda,scl,i2c.SLOW) 
- 
--- write DAC 
-function write_dac(control,value) 
-        i2c.start(0) 
-        i2c.address(0,0x48,i2c.TRANSMITTER) 
-        i2c.write(0,control) 
-        i2c.write(0,value) 
-        i2c.stop(0) 
-end 
- 
--- DAC output 
-for i = 0, 255, 10 do 
-        write_dac(64,i) 
-        print (i) 
-        tmr.delay(100000) 
-end 
-</code> 
- 
-When the script is run with eSPY we can see the DAC output ramp up and a running commentary. 
-<code> 
-0 
-10 
-20 
-30 
-... 
-230 
-240 
-250 
-</code> 
- 
-== RPi == 
- 
-Using [[:tools:i2ctools|I2C Tools]] on the RPi we reset the output to 0V, then raise it to 1.6V and finally 3.3V. 
-<code> 
-i2cset -y 1 0x48 64 0 
-i2cset -y 1 0x48 64 128 
-i2cset -y 1 0x48 64 255 
-</code> 
- 
-With a potentiometer connected to AIN0 a reading was made on the RPi. 
-<code> 
-i2cset -y 1 0x48 64 ; i2cget -y 1 0x48 ; i2cget -y 1 0x48 
-0x1b 
-0x8d 
-</code> 
-The second value above is the new reading, the first is the previous reading. 
- 
-This is simplified view of the operation of this device. Please read the [[#resources|data-sheet]] for the full details. 
- 
-=== 24LC512 === 
- 
-I2C EEPROMs have varied addressing schemes. The simplest is a 8-bit address offset, another one where a block selection is made with an I2C address and a byte selection is made with an 8-bit address offset. Yet another, where the I2C address is fixed but it now has a 16-bit address offset and lastly one with both of the last methods combined. 
- 
-The 24LC512 which uses 16-bit addressing. The addressing byte order is high byte, low byte. 
- 
-== ESP-01 NodeMcu == 
- 
-On the ESP-01 we can use this NodeMcu LUA script to read the EEPROM. 
-<code> 
-#!espy /dev/ttyUSB0 
- 
--- pin 3 = GPIO0 
-sda=3 
- 
--- pin 4 = GPIO2 
-scl=4 
- 
--- init I2C 
-i2c.setup(0,sda,scl,i2c.SLOW) 
- 
--- read EEPROM 
-function read_eeprom(addrhigh,addrlow) 
-        i2c.start(0) 
-        i2c.address(0,0x50,i2c.TRANSMITTER) 
-        i2c.write(0,addrhigh) 
-        i2c.write(0,addrlow) 
-        i2c.stop(0) 
- 
-        i2c.start(0) 
-        i2c.address(0,0x50,i2c.RECEIVER) 
-        c=i2c.read(0,1) 
-        i2c.stop(0) 
-        return c 
-end 
- 
--- read byte 
-reg = read_eeprom(0x00,0x00) 
- 
--- output byte 
-print(string.byte(reg)) 
-</code> 
- 
-Here the script is executed using eSPY. 
-<code> 
-./eeprom.esp 
-238 
-</code> 
- 
-eSPY is still being developed and as yet doesn't filter the LUA prompts from the output. 
- 
-== RPi == 
- 
-On the RPi we can reset the internal address pointer of the chip to 0 like this. 
-<code> 
-i2cset -y 1 0x50 0 0 
-</code> 
- 
-To read, we first write an address to start at then begin reading, if we keep reading the address is auto-incremented. 
-<code> 
-i2cset -y 1 0x50 0 0 
-i2cget -y 1 0x50 
-0x55 
-i2cget -y 1 0x50 
-0xaa 
-</code> 
- 
-If we want to write to a location we send the address followed by the byte of data. 
-<code> 
-i2cset -y 1 0x50 0 0 0xEE i 
-i2cset -y 1 0x50 0 0  
-i2cget -y 1 0x50 
-0xee 
-</code> 
- 
-This overview gives enough information to use the device at a byte level, read the [[#resources|data-sheet]] for the page writing mode of operation. 
- 
-=== Resources === 
-[[http://ww1.microchip.com/downloads/en/DeviceDoc/20090C.pdf|MCP23016 data-sheet]]\\ 
-[[http://www.nxp.com/documents/data_sheet/PCF8591.pdf|PCF8591 data-sheet]]\\ 
-[[http://ww1.microchip.com/downloads/en/DeviceDoc/21754M.pdf|24LC512 data-sheet]]\\