From charlesreid1

Line 132: Line 132:


To run a simple hello world with the Sainsmart LCD hooked up to the Pi, it is necessary to send IC2 signals out over pins 3 and 5, SDA/SCL.  
To run a simple hello world with the Sainsmart LCD hooked up to the Pi, it is necessary to send IC2 signals out over pins 3 and 5, SDA/SCL.  
http://hardware-libre.fr/2014/03/en-raspberry-pi-using-a-4x20-characters-display/


===SMBus===
===SMBus===
Line 139: Line 142:
To communicate over the I2C ports, you can use the I2C standard protocol, but you can also use SMBus, which is a subset of the I2C protocol. SMBus is common in devices, I suppose, so you want to use it when you can - that way, it'll work if I2C is used, and it'll work if SMBus is used.
To communicate over the I2C ports, you can use the I2C standard protocol, but you can also use SMBus, which is a subset of the I2C protocol. SMBus is common in devices, I suppose, so you want to use it when you can - that way, it'll work if I2C is used, and it'll work if SMBus is used.


===Installing py-smbus fails with Dependency Turds===
Unfortunately, however, before we can use this code, we need to address the fact that the Pi uses 3.3 V logic, but the LCD display uses 5.5 V logic. So we need a logic converter, 3.3V to 5V.  
 
To install the SMBus library, you can install the <code>smbus-cffi</code> library via pip, or via the pypi page [https://pypi.python.org/pypi/smbus-cffi/0.1]. A quote from the pypi page: "This Python module allows SMBus access through the I2C /dev interface on Linux hosts. The host kernel must have I2C support, I2C device interface support, and a bus adapter driver." This is exactly what we need.
 
Unfortunately, this script uses SMBus. SMBus requires smbus-cffi. cffi requires libffi. libffi requires autoreconf. This tool is not installed, so I can't make a stinking makefile to install libffi to install smbus-cffi to install SMBus.
 
So much for "owning your own devices!"


===If only we had aptitude===
===If only we had aptitude===
Line 153: Line 150:
</pre>
</pre>


===python-smbus===
===The Code===


Download the deb file for ARMEL architecture here: https://packages.debian.org/wheezy/python-smbus
<pre>
import smbus
from time import *


Then install it like this:
class i2c_device:
  def __init__(self, addr, port=1):
      self.addr = addr
      self.bus = smbus.SMBus(port)


<pre>
# Write a single command
$ dpkg -i python-smbus_3.1.0-2_armel.deb
  def write_cmd(self, cmd):
</pre>
      self.bus.write_byte(self.addr, cmd)
      sleep(0.0001)


# Write a command and argument
  def write_cmd_arg(self, cmd, data):
      self.bus.write_byte_data(self.addr, cmd, data)
      sleep(0.0001)


# Write a block of data
  def write_block_data(self, cmd, data):
      self.bus.write_block_data(self.addr, cmd, data)
      sleep(0.0001)


===The Code===
# Read a single byte
  def read(self):
      return self.bus.read_byte(self.addr)


# Read
  def read_data(self, cmd):
      return self.bus.read_byte_data(self.addr, cmd)


# Read a block of data
  def read_block_data(self, cmd):
      return self.bus.read_block_data(self.addr, cmd)
</pre>


===The Circuit===
===The Circuit===

Revision as of 02:23, 15 June 2016

Also see Arduino LCD Display, which was the original.

Overview

See Arduino LCD Display#Overview for an overview of how the LCD display works. It works by communicating with the microcontroller using I2C pins, which provide a way for integrated circuits to communicate with each other.

The Circuit

Breadboard Diagram

Need to make a firtzing diagram for this.

Breadboard Photo

Here's a photo of the breadboard:

File:RaspberryPi LCD Circuit.jpg

Python Sketch

More information about the Raspberry Pi GPIO pinouts and how to control 'em with Python is over on the RaspberryPi/Blink page.

Specifically, here is some Python code written to control GPIO pins on the Raspberry Pi: RaspberryPi/Blink#The_Python_Code

The Code

This section covers the software needed to drive the LCD display via the GPIO pins on the Raspberry Pi.

Adafruit provides an entire package for interfacing with character LCD displays [1]. Unfortunately, however, these are for LCDs that do not have an integrated circuit onboard, and so have a much greater number of pins. This is an excellent illustration of why we would want to install an integrated circuit to control the LCD, rather than controlling the LCD directly.

Without the IC onboard the LCD, we might need to connect up to 16 pins:

LCD16pins 1.jpg

LCD16pins 2.jpg

But with the Pi, we have only the two power pins (which can/should be connected to something other than the Pi) and the SDA/SCL pins.

LCD16pins 3.jpg

Preparing the Pi

Basic Connection to Pi

Make sure you can log in to the Pi. This consists of the following steps:

  • Mount the SD card and edit cmdline.txt, hard-code an IP address in cmdline.txt
  • Unmount the SD card and insert it back into the Pi and power it up
  • Give the Pi a minute to finish booting up, then connect it using an Ethernet cable to your desktop/computer
  • Remotely log in to the Pi via SSH

Installing Pi GPIO Library

Adafruit code for controlling LCDs from the Raspberry Pi: https://github.com/adafruit/Adafruit_Python_CharLCD

Make sure the RPi-GPIO package is installed:

Download the package on your laptop and copy it over to the Pi:

[laptop] $ wget https://pypi.python.org/packages/source/R/RPi.GPIO/RPi.GPIO-0.5.11.tar.gz
[laptop] $ scp RPi.*.tar.gz pi@169.254.113.200:~/.

Then you install it manually on the Pi:

[pi] $ cd ~
[pi] $ tar xzf RPi*.tar.gz
[pi] $ cd RPi*
[pi] $ sudo python setup.py install

This has other prerequisites, all available from Adafruit on GitHub (need to add links):

Adafruit_Python_PureIO
Adafruit_Python_GPIO
py-spidev

These will need to be installed in a similar way (downloading on an internet-connected computer, and copied over to the py so you can run python setup.py install). Alternatively, you can hook up the Pi to an internet-connected router, which makes it easier to both remotely connect to it and to be able to use tools like pip and apt-get.

Enable SPI

In order to use the GPIO, you need the GPIO library installed above (which provides bindings between Python and the Raspberry Pi kernel, which contains code to control the pins on-board the Pi).

However, in order to use I2C, which is the protocol used to communicate from one integrated circuit to another, you need to enable SPI on the Raspberry Pi.

This page [2] states that SPI is not enabled by default on Raspbian. However, I had Kali for ARM installed, and SPI was enabled by default. If you run the lsmod command, you can check whether the SPI kernel module is enabled. (This stuff is mostly over my head anyway, but you don't have to understand all the details of what's going on to make it work...)

$  lsmod
Module                  Size  Used by
cfg80211              498967  0
rfkill                 22468  1 cfg80211
snd_soc_wm8804          8209  0
snd_soc_pcm512x_i2c     2562  0
regmap_spi              2307  1 snd_soc_wm8804
snd_soc_tas5713         5858  0
snd_soc_pcm512x        16523  1 snd_soc_pcm512x_i2c
regmap_i2c              3338  3 snd_soc_wm8804,snd_soc_pcm512x_i2c,snd_soc_tas5713
snd_soc_bcm2708_i2s     7595  0
regmap_mmio             3548  1 snd_soc_bcm2708_i2s
snd_soc_core          167442  4 snd_soc_pcm512x,snd_soc_wm8804,snd_soc_tas5713,snd_soc_bcm2708_i2s
snd_compress            8840  1 snd_soc_core
snd_pcm_dmaengine       5770  1 snd_soc_core
snd_pcm                92149  4 snd_soc_pcm512x,snd_soc_wm8804,snd_soc_core,snd_pcm_dmaengine
snd_timer              23475  1 snd_pcm
spi_bcm2708             6006  0
i2c_bcm2708             6244  0
snd                    67406  4 snd_soc_core,snd_timer,snd_pcm,snd_compress
fuse                   92370  1
ipv6                  353829  0

The line we're looking for here relates to SPI:

spi_bcm2708             6006  0

This means we have the SPI kernel module enabled. In case you don't have it enabled, you can find instructions here [3]. Basically, enable the kernel module using modprobe:

$ sudo modprobe spi_bcm2708
$ sudo chown `id -u`.`id -g` /dev/spidev0.*

Hello World

See [4] for Raspberry Pi pinout diagram.

To run a simple hello world with the Sainsmart LCD hooked up to the Pi, it is necessary to send IC2 signals out over pins 3 and 5, SDA/SCL.


http://hardware-libre.fr/2014/03/en-raspberry-pi-using-a-4x20-characters-display/

SMBus

Let's introduce yet another acronym-infused techno-jargony term: SMBus.

To communicate over the I2C ports, you can use the I2C standard protocol, but you can also use SMBus, which is a subset of the I2C protocol. SMBus is common in devices, I suppose, so you want to use it when you can - that way, it'll work if I2C is used, and it'll work if SMBus is used.

Unfortunately, however, before we can use this code, we need to address the fact that the Pi uses 3.3 V logic, but the LCD display uses 5.5 V logic. So we need a logic converter, 3.3V to 5V.

If only we had aptitude

sudo apt-get install python-smbus i2c-tools. Enter "sudo reboot" to restart the pi and now the I2C pins will be available to use.

The Code

import smbus
from time import *

class i2c_device:
   def __init__(self, addr, port=1):
      self.addr = addr
      self.bus = smbus.SMBus(port)

# Write a single command
   def write_cmd(self, cmd):
      self.bus.write_byte(self.addr, cmd)
      sleep(0.0001)

# Write a command and argument
   def write_cmd_arg(self, cmd, data):
      self.bus.write_byte_data(self.addr, cmd, data)
      sleep(0.0001)

# Write a block of data
   def write_block_data(self, cmd, data):
      self.bus.write_block_data(self.addr, cmd, data)
      sleep(0.0001)

# Read a single byte
   def read(self):
      return self.bus.read_byte(self.addr)

# Read
   def read_data(self, cmd):
      return self.bus.read_byte_data(self.addr, cmd)

# Read a block of data
   def read_block_data(self, cmd):
      return self.bus.read_block_data(self.addr, cmd)

The Circuit

The Result

Flags