LCD画面上にキャラクターを表示してキー入力で上下左右に移動させることができるようになりました。
キャラクターの画像は、LCDライブラリにキャラクターデータを転送する関数がなかったため、8バイトのドット絵を作成して1ピクセルずつ描画しています。
キー入力で画面を縦横無尽に移動できるようになったのですが、LCDに描画する量が少ないとかなり早く移動出来ます。
ただ、画面全体を書き換えたり、ちょっとした正方形を塗りつぶすだけでも、結構時間が掛かるようでキャラクターの移動が遅くなってしまいます。
Arduino と LCD を使用してミニコンソールを作成してみたいと思います。
このLCDモジュールですが、Arduino のライブラリが使用でき、SD カードスロットも搭載しているので、入力ボタンをつけるとミニゲーム機として動作させることができるのではないかと思います。
まず部品を実装します。部品と言ってもタクトスイッチぐらいなのですが、Arduino 用と LCD 用のピンソケットもつけてプロトタイプとして動作できるようにします。
部品を実装するとこんな感じです。最初はタクトスイッチを Arduino のポートに直結しただけだったのですが、これだとボタンを押していない時にピンが接続されていない状態となり、信号が不安定になるため、10kΩの抵抗を入れて GND と接続しています。
通電した所、ちゃんとLCDも動作しているみたいです。
すべてのタクトスイッチの検査をするためにサンプルプログラムを作ってみました。
押したボタンに応じて、Arduino 上のLEDを点滅させます。
#define KEY_UP 1
#define KEY_DOWN 3
#define KEY_LEFT 0
#define KEY_RIGHT 5
#define KEY_A 6
#define KEY_B 14
#define LED 13
#define DELAY 100
void setup() {
pinMode(0, INPUT);
pinMode(1, INPUT);
pinMode(3, INPUT);
pinMode(5, INPUT);
pinMode(6, INPUT);
pinMode(14, INPUT);
pinMode( LED, OUTPUT);
}
void loop() {
int blnFlag = 0;
if ( digitalRead( KEY_LEFT ) == 1 ) {
blnFlag = 1;
}
if ( digitalRead( KEY_UP ) == 1 ) {
blnFlag = 2;
}
if ( digitalRead( KEY_DOWN ) == 1 ) {
blnFlag = 3;
}
if ( digitalRead( KEY_RIGHT ) == 1 ) {
blnFlag = 4;
}
if ( digitalRead( KEY_A ) == 1 ) {
blnFlag = 5;
}
if ( digitalRead( KEY_B ) == 1 ) {
blnFlag = 6;
}
if ( blnFlag > 0 ) {
for ( int intI=0; intI
delay( DELAY );
digitalWrite( LED, LOW);
delay( DELAY );
}
} else {
}
digitalWrite( LED, LOW);
}
キー入力は無事にすべて動作するようになりました。
次はLCDに何か表示してみたいと思います。
スイッチサイエンスで Adafruit Pro Trinket を購入しました。
以前に Atmega32u4 ボードを持っていたのですが、調子がおかしくなってしまい動作が安定しなくなったため、新しく Arduino を購入しました。
このボードは Arduino 互換でクロックが水晶なので、シリアルLEDテープを駆動したり、プログラムの開発に Arduino IDE が使えるなどいろいろ便利かと思います。
ただ、通常の Arduino IDE ではプログラムの転送が出来なかったため、その方法を解説します。
1.まず Arduino IDE を最新バージョンにします。
私がダウンロードしたバージョンは 1.6.6 でした。
https://www.arduino.cc/en/Main/Software
2.次にダウンロードした IDE を起動して、ツール⇒マイコンボード⇒ボードマネージャーを選択します。
3.Type で Contributed を選択すると「Adafruit AVR Boards by Adafruit」が表示されます。
これをクリックして「インストール」します。
4.するとマイコンボードに「Pro Trinket 5V/16MHz(USB)」が表示されますので、選択します。
5.書き込み装置に”USBtinyISP”を選択します。
これでUSB経由でプログラムを転送することが出来ます。
USB接続後、10秒間はブートローダーが起動した状態となります。この間に書き込みを行ってください。
10秒経過すると書き込まれたプログラムが動作します。ボード上のリセットボタンを押すともう一度
10秒間ブートローダーが起動します。
火星に送った Raspberry Pi を地球からコントロールしたいのですが、わざわざ SSH でログインしてコマンドを叩いてログインするというのも使いづらいので、ブラウザからコントロールできるように NGINX をインストールしたいと思います。
インストール方法は至って簡単。
sudo apt-get install nginx
インストール後に下記のコマンドでnginxを起動します。
sudo /etc/init.d/nginx start
Mac のブラウザでアクセスすると、見えました。nginx!
Raspberry Pi 起動時に自動的に nginx が起動するように設定します。
sudo ln -s /etc/init.d/nginx /etc/rc3.d/nginx
nginx は組込機器向けの軽量なウェブサーバーでPHPも動作するということで、最初はApacheを入れようかと思ったのですが、Raspberry Pi のサイトでもおすすめだった nginx にしました。
ゆくゆくはnginxで動作するプログラムを作成して Raspberry Pi をコントロールしようと思います。
今回はロボットの目となるカメラモジュールを追加します。
Raspberry Pi には標準のカメラモジュールが用意されています。このモジュールは、フラットケーブルでRaspberry Pi の基板に直接搭載できる様になっています。
このままではケースの蓋が閉まらないのですが、ちょうどうまい具合にフラットケーブルの幅とイーサネットのコネクタの幅が同じぐらいで、その隙間からケースの外へカメラを回すことができました。
早速電源を入れてカメラの動作テスト。Linux上ではカメラもコマンドラインから撮影を行います。
撮影した画像がこれ。かなり高解像度で綺麗に撮影できます。
画像のサイズは2592×1944ピクセルで2.8Mバイトぐらい、JPEGで保存されます。
これぐらいの解像度があるとかなり細かいところまで確認できます。
多分、顔認識とかもできると思いますので、最終的にはOpenCVで顔認識とかも実験したいと思います。
このプロジェクトの目的はRaspberry Pi でロボットを作ることです。
ロボットとして縦横無尽に地を這いまわるためには、「ケーブル」という呪縛から解き放たれなければなりません。
現状はこのような状況です。
電源ケーブル・HDMIケーブル・マウス・キーボード・LANケーブル
これらのケーブル類を一本ずつ解き放っていきましょう。
今日はLANケーブルを無線化します。極小無線LANアダプタです。
このアダプタをUSBポートにぶっ刺して設定を行いますと無線LAN接続出来ました!
詳しい設定方法はGoogleで検索してください。私が書かなくても詳しく解説してくださっている方がいますので。
最終的にはディスプレイやマウスやキーボードも外して単体運用したいのですが、起動時にDHCPで割り当てられたIPアドレスを通知する機能を追加しようと思います。
apt-get で postfix をインストールして /etc/rc.local にメールを送信するコマンドを記述します。
おぉ、再起動すると無線LANに割り当てられたIPアドレスの情報が自動的に送られてきました。
今まで時間がなくて実行できなかったプロジェクトを再度始動。
初期のRaspberry PIと32GBのSDカードに最新のOSをインストールして起動してみることに。
新しい Raspberry PI が発売されていたので、もう初期型は使用できないのではないかと思っていたら、OSは新旧区別なく同じものが使用可能とのこと。
しかもインストーラーも新しくなっているようなので、早速ダウンロードしてインストールすることにしました。
ほとんどの解説サイトではWindows環境からのインストールでしたが、Mac でも同じようなことができるのか、確認のために Mac から SDカードをフォーマットしてインストールしてみることにしました。
日本語環境も標準で入っているようです。インストーラーが起動するまでしばらく待ってみます。