もう一つ片す。aitendoで以前買ったRCU6093W搭載
の液晶シールド。
ハンダ付けだけすると、強度的に超頼りないので、
四隅をホットボンドで固めておく。
こんな。
これでシールドとして使えるなら、簡単でいいなぁ
とかたかくくってたんだけど…
こいつの動作確認。
http://www.aitendo.com/product/11084
aitendoサイトからリンクして、
http://ashitani.jp/wiki/index.rb?p=RCU6093W-B
こちらのサイトでArduinoのスケッチが公開されて
いるので(感謝!)、まずはこれを動かしてみる。
…結果から言うと、普通にさくっと動いた。
問題は、このaitendo液晶シールドの基板について。
設計がやっぱりaitendoならではのところがあって、
色々悩む。
まず、寸法。
片側(デジタルI/Oピン側)は、
こんな感じでいいんだけど、アナログI/Oピン側は、
2.54mmピッチになってない。微妙におかしなピッチ
なので、ピンヘッダが刺さらない。
仕方がないので、必要なピンだけ挿してハンダ付け。
(このように4本を、2本ずつに切り分けて、向きを
微妙に内向きに挿してハンダ付け)
とりあえず、こういう感じ。リセット、Vcc(3.3V)、
GNDを残す。とりあえず、これでシールドとして
差し込むことは出来るように。
次。中途半端にSPI端子関係のピンを利用しようと
しているっぽい。
この基板の配線を眺めてみると、上記のリンク先
サイトのスケッチがそのまま動くわけではなく、
SPI周りのピンが中途半端に選択されている。
でも、液晶からの入力はないので、内蔵ハードの
SPIは使えない。自分でI/Oピンを上げ下げして
制御する必要あり。
なんでこんなピン配置にしたんだろうねぇ?って
言うか、それ以前に、2.54mmピッチにしようよ…
で、このあたりのピンって、PORT-Bになるので、
PORT-Dと違って、Arduinoのピン番号と、ポート番号
が一致しない。
なので、これまでのコードを色々修正する必要が
必要になっちゃう。
まぁ、仕方ない。で、3.3V動作の液晶なので、
例によって、オイラ謹製の秋月基板を改造した
Arduino互換機(3,3V、8MHz動作)を投入。
リンク先のサンプルスケッチが無事動いたので、
それをちょっと弄って、いつものパターンを表示
してみる。こんな。
スケッチはこんな。
#include<avr/pgmspace.h>
// org aitendo shield
#define RST 2 // **
#define SCE_B 12 // D5 -> D12 (port-B4)
#define DC_B 10 // D4 -> D10 (port-B2)
#define SCLK 13 // D3 -> D13 (port-B5)
#define SDIN 11 // D6 -> D11 (port-B3)
//#define LED 13
#define DATA 0
#define COMMAND 1
void lcdWrite(char data, char mode){
int i;
PORTB &=0b11101111; // SCE_B=0 (port-B4)
for(i=7;i>0;i--){
if(data & 0x80){
PORTB |=0b00001000; // SDIN=1 (port-B3)
}
else{
PORTB &=0b11110111; // SDIN=0 (port-B3)
}
PORTB |=0b00100000; // SCLK=1 (port-B5)
PORTB &=0b11011111; // SCLK=0 (port-B5)
data<<=1;
}
if(data & 0x80){
PORTB |=0b00001000; // SDIN=1 (port-B3)
}
else{
PORTB &=0b11110111; // SDIN=0 (port-B3)
}
if(mode==DATA){
PORTB |=0b00000100; // DC_B=0 (port-B2)
}
else{
PORTB &=0b11111011; // DC_B=0 (port-B2)
}
PORTB |=0b00100000; // SCLK=1 (port-B5)
PORTB &=0b11011111; // SCLK=0 (port-B5)
PORTB |=0b00010000; // SCE_B=1 (port-B4)
}
void initialize(){
digitalWrite(SCK,0);
digitalWrite(DC_B,0);
digitalWrite(SCE_B,0);
digitalWrite(RST,0);
delay(10);
// initialize
lcdWrite(0x21,COMMAND); // FUNCTION SET: PD=1, V=0, EXTENDED INST
lcdWrite(0xBD,COMMAND); // CONTRAST
lcdWrite(0x14,COMMAND); // BIAS 1/7
lcdWrite(0x20,COMMAND); // FUNCTION SET: PD=1, V=0, BASIC INST
lcdWrite(0x0C,COMMAND); // D=1 E=0 normal disp
delay(10);
}
void setup() {
int i;
pinMode(SCE_B, OUTPUT);
pinMode(DC_B, OUTPUT);
pinMode(SCLK, OUTPUT);
pinMode(SDIN, OUTPUT);
initialize();
lcdWrite(0x40, COMMAND); // Y adr=0
lcdWrite(0x80, COMMAND); // X adr=0
// Clear
for(i=0;i<918;i++)
{
lcdWrite(0,DATA);
}
}
void loop() {
int x,y,i;
static byte b = 0;
for ( y = 0 ; y < 64 / 8 ; y++ ){
i = 1;
<span style="color: #CC6600;">for
( x = 0 ; x
// Y adr=0
lcdWrite(0x80 + x, COMMAND);
// X adr=0
lcdWrite(i xor b, DATA);
i++;
delay(10);
}
}
delay(500);
// Clear
for(i=0;i<918;i++)
{
lcdWrite(0,DATA);
}
delay(500);
b = b xor 255;
}
(if文の不等号とか、ビットシフトの不等号とか、
ちゃんと出てるかな?このブログサイト、html
タグ関係の処理がいまいちなので、勝手に削除
されたりするですよ。プレビューでは表示されて
いるのに、投稿を確定すると消えちゃうとか…
あと、1行おきに改行入っちゃうとかもなぁ…)
(追記:include文が化けてました。仕方ないので、
例によって不等号は全角に換えてあります)
ピンは、以下のように変更。
SCE_B : D5 から D12 (port-B4)
DC_B : D4 から D10 (port-B2)
SCLK : D3 から D13 (port-B5)
SDIN : D6 から D11 (port-B3)
ちなみに、リセットはArduinoのリセットピンと
直結になっちゃってるので、スケッチ上から
任意のタイミングでリセット掛けられない
という仕様。
リセットピンはたぶん、ハンダ付けせずに、
基板上でジャンパー線這わせて、別のデジタル
ピンにアサインしなおしたほうがよさそう。
写真だと、そこそこくっきり表示されている感が
あるんだけど、バックライトが12Vくらい必要で、
今点けてない状態。写真より見づらい。なので、
http://brown.ap.teacup.com/nekosan0/2512.html
この間の12V昇圧回路とかを組み合わせたいなぁ、
と思っているところ。
さて、いつものパターンが表示できたので、もう、
作りかけオシロの画面も簡単に出るだろう…と
思って、いざ動かしてみてびっくり。
なんじゃこりゃ?
なんじゃこりゃ?
ビット列が、上下さかさまなんだな。
データシート調べてみると、どうやら、ビット列
の向き(LSBが下、MSBが上)は、固定みたい。他の
液晶だと、確かセレクトできたと思うんだけどな。
どうするかな…
画面右下を「左上」と看做すか???
うーーーーん。そうしちゃうと、1バイト描くごとに
内部アドレスを1個インクリメントする処理が、
まったく逆向きになっちゃって、むしろ困ることに
なるよな、と。
仕方がないので、ASCII文字フォント、猫のビットマップ、
pset/preset関数が使うビットパターンのイメージを
上下逆転させる作戦を取ることに。
手でソースコード直すのは死んじゃうので、ビット
パターンを元に、シリアルモニタにArduinoのソース
コード(配列の部分のみ)を生成するツールをでっち
あげる。その配列データを下のソースに取り込んで、
組み込んでみると、こんな。
出た出た。表示かくにん。よかった。
…出たことは出たんだけど、どうやら、コンパイラ
のバージョンがArduino1.6.0から変わったせいか、
PROGMEM関係あたりで、でかい配列はメモリを食い
まくるようで、2048バイト全部食いつぶしている
みたい。暴走して止まっちゃう。
まぁ、表示は出来たからよしとする。
その後をどうするかは別問題だな。
バックライト点けたいな… 12Vだよな。