2012年8月12日日曜日

Raspberry Pi + LCD Shield

 前回、Raspberry Pi で Arduino用のMotor Shieldが動かせたので、今回は調子に乗ってLCD Shieldを試して見ることにしました。と、いっても、WiringPi に元々LCDを使うための関数が作りこまれているので、今回使用したPrototying Lab LCD Shieldにピン配置を合わせて、コーディングしただけです。ただし、pythonのラップはなかったのでCで書いています。


 クロス開発しなくていいのがRaspberry Pi のいいところですが、コーディングをする際などにもたつきを感じたりすることがあります。そこで、ネット上でSambaの設定を調べて、Windowsパソコンとファイル共有できる状態にして、あらかたのコードを普段使っているWindowsの環境で作っておき、ビルド、実行、デバッグ、修正をRaspberry Pi上でやるような感じにしています。


 今回のコードはこんなかんじです。Gordons ProjectsWiringPiを使わしてもらっています。


#include <stdio.h>
#include <stdlib.h>
#include <stdint.h>
#include <time.h>

#include <wiringPi.h>
#include <lcd.h>

// Raspduino のピン定義。
#define PIN_RXD 16 
#define PIN_TXD 15
#define PIN_D02 0
#define PIN_D03 1
#define PIN_D04 2
#define PIN_D05 3
#define PIN_D06 4
#define PIN_D07 5
#define PIN_D08 6
#define PIN_D09 7
#define PIN_D10 10
#define PIN_D11 12
#define PIN_D12 13
#define PIN_D13 14
#define PIN_SDA 8
#define PIN_SCL 9

#define PIN_LOW 0
#define PIN_HIGH 1

// LCD Shield のピン定義。
const int PIN_LCD_RS = PIN_D12;
const int PIN_LCD_E = PIN_D11;
const int PIN_LCD_D4 = PIN_D05;
const int PIN_LCD_D5 = PIN_D04;
const int PIN_LCD_D6 = PIN_D03;
const int PIN_LCD_D7 = PIN_D02;


// LCD関連定数の定義。
const int LCD_ROW_NUM = 2;
const int LCD_CLM_NUM = 16;
const int LCD_MODE_4BIT = 4;


int main(int argc, char **argv)
{
 int lcd;
 
 // WiringPi 初期化。
 if (wiringPiSetup() == -1) exit(1);
 
 // LCD初期化。
 lcd = lcdInit(LCD_ROW_NUM, // LCD行数。
    LCD_CLM_NUM,  // LCDカラム数。
    LCD_MODE_4BIT,  // 4bitモード。
    PIN_LCD_RS,  // RS
    PIN_LCD_E,  // E
    PIN_LCD_D4,  // 以下データピン
    PIN_LCD_D5,
    PIN_LCD_D6,
    PIN_LCD_D7,
    0, 0, 0, 0);
 if (lcd == -1)
 {
  printf("LCD Initialize Error\n");
  return 1;
 }
 
 sleep(1);
 
 lcdPosition(lcd, 0, 0);
 lcdPuts(lcd, "Hello,Raspberry!");
 
 lcdPosition(lcd, 0, 1);
 lcdPuts(lcd, "Raspduino!!");
   
 return 0;
}


 Raspduino (Raspberry Pi GPIOコネクタ ←→ Arduino ピン配置変換)アダプタが思ったよりも使えそうなので、回路図(というのは恥ずかしすぎるものですが)的にはこんな感じです。


 要はRaspberry Pi のGPIOを ロジックレベル変換モジュール(自分は秋月の双方向ロジックレベル変換モジュールを使いました)とI2Cレベル変換モジュール(自分は秋月のI2Cレベル変換モジュールを使いました)でRaspberry Pi側3.3VとArduino側コネクタを切り離し(変換)しています。Arduino側はジャンパの切り替えで外部電源とRaspberry Piの5V(USBコネクタからの給電)を切り替えられるようにしています。ピンマッピング等の検討はこんな感じ