「PIC AVR 工作室」サイトの日記的なブログです。
サイトに挙げなかった他愛ないことを日記的に書き残してます。
PIC AVR 工作室 ブログ



もう一つ片す。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だよな。



コメント ( 0 )
  • X
  • Facebookでシェアする
  • はてなブックマークに追加する
  • LINEでシェアする