Raspberry PiとGR SAKURAでキャラクターLCD (1)
Raspberry PiをDHCPで使うと振られたIPアドレスがわからなくて難儀することあるね、と知り合いに言ったら「これにIP出したら」と秋月の20x4キャラクターLCDを分けてくれました。
調べたら5Vデバイスということで、3.3VのRaspberry Piとは直接つなげません。レベル変換するのが普通なのでしょうが、買ったままあまりいじっていなかったGR SAKURAが手元にありましたので、そちらをロジックのレベル変換に使って表示させてみました。
GR SAKURA自体は3.3Vなのですが、5VトレランスのGPIOポートがいくつかあるので、そちらにつなぐような格好になります。Rapberry PiとSAKURAボードはUARTで接続しました。
GR SAKURAのスケッチは以下の通りです。
/*GR-SAKURA Sketch Template Version: V1.06*/ #include <rxduino.h> #include <LiquidCrystal.h> #include <string> #define INTERVAL 100 LiquidCrystal lcd(4, 5, 6, 7, 8, 9); int swflag = 0; int numread = 0; void setup() { pinMode(PIN_LED0,OUTPUT); pinMode(PIN_LED1,OUTPUT); pinMode(PIN_LED2,OUTPUT); pinMode(PIN_LED3,OUTPUT); pinMode(PIN_SW, INPUT); pinMode(2, INPUT); digitalWrite(PIN_LED0, 0); digitalWrite(PIN_LED1, 0); digitalWrite(PIN_LED2, 0); digitalWrite(PIN_LED3, 0); Serial.begin(38400, SCI_SCI0P2x); lcd.begin(20,4); lcd.clear(); lcd.home(); lcd.setCursor(0,0); // lcd.print("hello\n"); delay(INTERVAL); digitalWrite(PIN_LED0, 1); digitalWrite(PIN_LED1, 1); digitalWrite(PIN_LED2, 1); digitalWrite(PIN_LED3, 1); } void loop() { int c = 0; /* reset */ if(digitalRead(2) == HIGH){ if( swflag == 0 ){ system_reboot(REBOOT_USERAPP); swflag = 1; } } else{ swflag = 0; } /* UART -> LCD */ while(Serial.available() > 0){ c = Serial.read(); if(std::isprint(c)){ lcd.setCursor(numread,0); lcd.write(c); numread ++; } } }
Raspberry PiをリセットするとGR SAKURAが無反応になることがあったので、GPIO2にリセットを仕込んでRasperry Piの方から起動後にSAKURAをリセットしてからUART送信を実行するようにしています。(上のスケッチだとRapsberry Piが起動してGPIOをOUTに設定するまでSAKURAがリセットを繰り返します。イマイチ…)
リセットについて、初めはSAKURAのJ17を接続した上でリセットピンから操作してみたのですが、リセットボタンを押したときと同様のPCからスケッチを転送するモードで起動してしまいうまくいきませんでした。何か方法があるのかもしれませんが…。
Raspberry Pi側はUART送信のために、シリアル経由のログイン機能をつぶして、起動時に自作のプログラムでIPアドレスの文字列を送信しています。そちらは次回に。