Raspberry PiとGR SAKURAでキャラクターLCD (1)

Raspberry PiDHCPで使うと振られた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アドレスの文字列を送信しています。そちらは次回に。