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アドレスの文字列を送信しています。そちらは次回に。

Raspberry Piでゆっくり声

知り合いのところに某部材販売サイトからRaspberry Pi入荷のお知らせが届いたと聞きまして、便乗して自分の分も頼んでみました。

手元にDE0で使った音声合成LSIがあったので、とりあえずI2Cでつないでしゃべらせてみることに。

i2cの送信に関しては、検索で出てきたi2c-toolsを使っております。インストールは、下記のサイトの手順に従って行いました。

Raspberry Pi I2C How-To ガイド by @azarashi55

ちょっとはまったのが、

$ sudo i2cdetect 0

これが、現行の基板だと末尾に1を指定するように変わっており、なんで認識されないのだろうと…。わかれば簡単なことでした。ちなみに、音声合成LSIのI2Cアドレスは0x2eのようです。

実際にしゃべらせるときは、i2c-toolsのi2csetコマンドで文字列を送信するのですが、1バイトずつ16進に変換する必要がありまして、シェルスクリプトを書いてみました。

(経験少ないので変なところあるかと思いますが…)

#!/bin/bash

send=' -y 1 0x2e 0x00 '
str=$1
slen=${#str}
i=1

while [ $i -le $slen ]
do
        ch=`echo $1 | cut -c $i`
        chex=`perl -e "print unpack(\"H2\", \"$ch\")"`
        chex="0x${chex} "
        send="${send}${chex}"
        i=`expr $i + 1`
done

send="${send}0x0d i"

i2cset ${send}
talk.sh ohayo-.

みたいな感じで実行させると、「おはよう」としゃべります。

DE0買ってみた

少し前の話ですが、DE0というFPGAボードを買っていじってました。

ソリトンウェーブ

↑こちらの通販で、LCD付きの拡張キットと一緒に購入

FPGAというかハード設計初体験なので、とりあえず書籍の内容をそのまま実行させて遊んだ後、書籍のサンプルをつぎはぎして音声合成LSIをしゃべらせてみました。

PS2キーボードから入力した文字を音声合成LSIに送りつつLCDにも表示するという、少し凝ったもので、FPGAにCPUを構成する機能も使ってみたりして、自己満足感は高かったです。笑

使った音声合成LSIはコレです

秋月の「音声合成LSI ATP3011F1−PU(ゆっくりな女声)


PCにソフトーク入れろ、というのはナシで…。


参考にした書籍:

FPGA ボードで学ぶ組込みシステム開発入門 ?Altera編?

FPGA ボードで学ぶ組込みシステム開発入門 ?Altera編?


余談ですが、今回DE0をいじってみて、SDRAMやキャラクターLCD等のコントローラがIPという形で用意されており、簡単にCPUに組み込めるのに驚きました。

自分の会社の仕事ではハード屋さんが必要なコントローラやI/Oの数を見積もってCPUを決定するのですが、FPGAならそういうところを自由に決められるわけで、そのうち基板の上にはFPGAが1個あるだけなんて時代になるかもしれないなあとか妄想してしまいました。笑

『はじめる組込みLinux』+H8/3069Fボード

はじめる組込みLinux H8マイコン×uClinuxで学べるマイコン開発の面白さ

はじめる組込みLinux H8マイコン×uClinuxで学べるマイコン開発の面白さ

AKI−H8/3069FフラッシュマイコンLANボード: 組み立てキット 秋月電子通商 電子部品 ネット通販

ずいぶん前に仕事でLinux使うことになったので、この本と本で取り上げている秋月のH8ボードを買いまして。結局は別のCPUを採用したので開封もせずにしまいこんでたのですよね。

最近になって片付けしてたらでてきたので、本を読みながらボードを組み立ててみました。

社会人になって以来、ずっとファームでやってきてハードはさっぱり……ていうか、はんだ付けもろくにしたことなかったのですが、せっかくなのできちんと始めてみようと考え、はんだごて等の工具一式も購入してがんばってやってみたところ、紆余曲折は多々ありましたが、一応、書籍に載っている内容はほぼ全て網羅することができました。

以下、やってみたこと
DRAM 4MB増設(このはんだ付けは自信なかったので知り合いにアウトソース…)
LCD表示
uClinuxnfs起動
uClinuxのCF起動

本に書いてある通りにやっただけなので、完成した今でもわからないことだらけなのですが、電子工作デビュー作にしてはよく動いてくれたなあと。

最後にアドバイスというのもおこがましいのですが一点だけ……本には秋月のボードは小さいからIDE I/Fはユニバーサル基板に実装するようにと書いてあったのですが、最初はケチって秋月のボードに部品を乗せてしまいました。結果、配線がえらいことになってしまいハンダミスが多発しまして、狭いところに部品をのせているので修正もままならず……結局、安定動作してくれませんでした。

泣く泣くユニバーサル基板で作り直してどうにか動いたのですが、これからチャレンジする方はIDE I/Fを載せるなら、絶対ユニバーサル基板で作った方がいいと思いますよ!(ていうか、本に書いてあるんだから普通そうしますね…)