写真徒然草...

つれ\〃/なるまゝに、日ぐらしファインダーに向ひて、心に移り行くよしなしごとを、 そこはかとなく撮りつくれば、怪しうこそ物狂ほしけれ

スポンサーサイト

上記の広告は1ヶ月以上更新のないブログに表示されています。
新しい記事を書く事で広告が消せます。
  1. --/--/--(--) --:--:--|
  2. スポンサー広告|
  3. トラックバック(-)|
  4. コメント(-)

MultiWiiTriCopter その4

先週末、夕方はシリアル表示器で調整したMultiWiiTricopterですが、帰宅後に使っている液晶表示がI2Cインターフェイスだった事を思い出し、急遽夜なべして接続。

MultiWiiTricopterの全体回路図はこんな感じ。(下画像クリックで大きく表示します。) 
  image2745.jpg

WiiMotionPlusとNunchukがArduino Pro MiniにI2Cで接続されていますが、そこに並列でI2C LCDを追加。
I2C接続の液晶表示器はこちらの商品Strawberry Linuxさんは送料¥400なので、合わせて¥1,100で表示器追加可能。重さも8gなので、積載しても飛びに影響は無い?(但し、墜ちたときに割れないように補強すると重くなるかも?)
サイズは、2200mAhのリポと比較?

image2746.jpg 

ちなみに、こちらの商品は接続方法はまったく同じで、サイズがもう少し大きめ。流石に機体搭載は邪魔かも。コントラスト調整ができていないのはご愛敬...。 

image2747.jpg  
当然、接続しただけでは表示できません。プログラムの修正が必要です。
プログラムの修正については、この下のリンクで続きを表示してください! 

...と、その前に、注意事項を!

このI2C接続の液晶表示では、電気的に部品の規格外の使い方をしています。

1.この液晶のカタログ電圧は2.7~3.6V。マニュアルにはこの液晶コントローラは2.7~5.5Vとなっていて、販売社では5V動作確認はしているけど、メーカ保証は2.7~3.6Vとの事。私の接続図ではUBECの電圧が印加されるので、4.8~5.5V程度で動作させています。当然、動作保証外!最悪では、ArduinoやWiiMotionPlus、Nunchuk、液晶表示器が壊れたり、機体が墜落するかも?

2.通常、通電した状態で抜き差しする機器は接続順序として、GND→信号線→電源の順番で接続し、抜くときは逆に電源→信号線→GNDの順番で切断されるように工夫されています。(例えばUSBコネクタやWiiのコネクタはピンの長さを変えている) 自作なので、この辺りは省略。でも、やる気ならば、コネクタのピンの長さを切れば、実現可能。

3.WiiMotionPlusやNunchukは通信したまま、液晶を接続している。通常は通信を停止して接続し、つなぎ終わってから通信を再開しますが、面倒なので、通信したまま。但し、WiiMotionPlusやNunchukとは通信エラーが発生したら、リトライする、って記述があったので、大丈夫かも?

4.液晶表示への通信は送信のみ。双方向ではないので、まぁ、通信失敗しても大丈夫かな?

と、かなりいい加減な接続をしています。
なので、改造・製作はあくまでも自己責任でお願いします!(機体や部品が壊れても当方は一切責任を持ちません!)

ここでは、本家のプログラムリンクにある、MultiWiiV1_7を改造しています。他のバージョンでも、基本は同じだと思われます。

まずは、I2C液晶の表示用関数を追加。

916行目に以下のソースを追加します。

元のファイルは


  rawADC_WMP[5]= i2c_readNak();
}
                                ←ここが916行目。
// **************************
// ADC ACC
// **************************
#if defined(ADCACC)



で、追加後は


  rawADC_WMP[5]= i2c_readNak();
}

// *************************************
// I2C LCD display add 2011.04.10 Y.Mita
// *************************************
// I2C address 0x7C(8bit) 0x3E (7bit)

#define I2CLCDADR  0x7c

void i2c_LCD_cmd(byte x) { // send command to LCD
  i2c_rep_start(I2CLCDADR);
  i2c_write(0x00);
  i2c_write(x);
}

void i2c_LCD_data(byte x) { // send data to LCD
  i2c_rep_start(I2CLCDADR);
  i2c_write(0x40);
  i2c_write(x);
}

void i2c_LCD_move(byte pos){ // change cursor position of LCD
  i2c_LCD_cmd(0x80 | pos);
}
 
void i2c_LCD_puts(const char *s) { // put string on LCD
  while(*s) i2c_LCD_data(*s++);
}

byte contrast = 20;  // 0-63 at 5V system, set very small value

void i2c_LCD_init() { // LCD initialize
  // LCD initialize
  i2c_LCD_cmd(0x38); // function set
  i2c_LCD_cmd(0x39); // function set
  i2c_LCD_cmd(0x14); // interval osc
  i2c_LCD_cmd(0x70 | (contrast & 15)); // contrast low
  i2c_LCD_cmd(0x5c | (contrast >> 4 & 3)); // contrast high / icon / power
  i2c_LCD_cmd(0x6c); // follower control
  delay(300);
  i2c_LCD_cmd(0x38); // function set
  i2c_LCD_cmd(0x0c); // display on
  i2c_LCD_cmd(0x01); // clear display
  delay(2);
}

// **************************
// ADC ACC
// **************************
#if defined(ADCACC)


となります。


そして、初期化を追加。(但し、以下のソースコードの「←(これを追加)」は入れない事!)


void initLCD() {
  blinkLED(20,30,1);
  #if defined(LCD_TEXTSTAR)
    // Cat's Whisker Technologies 'TextStar' Module CW-LCD-02
    // http://cats-whisker.com/resources/documents/cw-lcd-02_datasheet.pdf
    // Modified by Luca Brizzi aka gtrick90 @ RCG
    LCDprint(0xFE);LCDprint(0x43);LCDprint(0x02); //cursor blink mode
    LCDprint(0x0c); //clear screen
    LCDprintChar("MultiWii");
    LCDprint(0x0d); // carriage return
    LCDprintChar("CONFIG PARAMS");
    delay(2500);
    LCDprint(0x0c); //clear screen
  #else
    Serial.end();
    //init LCD
    PINMODE_LCD //TX PIN for LCD = Arduino RX PIN (more convenient to connect a servo plug on arduino pro mini)
    i2c_LCD_init();  // add for i2c LCD 2011.04.10 Y.Mita    ←(これを追加)
  #endif
}




更に、表示に2行追加。(但し、以下のソースコードの「←(これを追加)」や、「(以降、長いので、省略)」は入れない事!)


void configurationLoop() {
  uint8_t chan,i;
  uint8_t param,paramActive;
  uint8_t val,valActive;
  static char line1[17],line2[17];
  uint8_t LCD=1;
  uint8_t refreshLCD = 1;

  typedef struct {
    char*    paramText;
    uint8_t* var;
    uint8_t  decimal;
    uint8_t  increment;
  } paramStruct;
 
  static paramStruct p[] = {
  {"PITCH&ROLL P", &P8[ROLL],1,1},
  {"ROLL   P", &P8[ROLL],1,1},     {"ROLL   I", &I8[ROLL],3,5},  {"ROLL   D", &D8[ROLL],0,1},
  {"PITCH  P", &P8[PITCH],1,1},    {"PITCH  I", &I8[PITCH],3,5}, {"PITCH  D", &D8[PITCH],0,1},
  {"YAW    P", &P8[YAW],1,1},      {"YAW    I", &I8[YAW],3,5},   {"YAW    D", &D8[YAW],0,1},
  {"LEVEL  P", &PLEVEL8,1,1},      {"LEVEL  I", &ILEVEL8,3,5},
  {"RC RATE", &rcRate8,2,2},       {"RC EXPO", &rcExpo8,2,2},
  {"PITCH&ROLL RATE", &rollPitchRate,2,2}, {"YAW RATE", &yawRate,2,2},
  {"THROTTLE PID", &dynThrPID,2,2},
  };

  initLCD();
  param = 0;
  while (LCD == 1) {
    if (refreshLCD == 1) {
      strcpy(line2,"                ");
      strcpy(line1,"                ");
      i=0; char* point = p[param].paramText; while (*point) line1[i++] = *point++;
      uint16_t unit = *p[param].var;
      if (param == 12) {unit *=2;} // RC RATE can go up to 500
      char c1 = '0'+unit/100; char c2 = '0'+unit/10-(unit/100)*10; char c3 = '0'+unit-(unit/10)*10;
      if (p[param].decimal == 0) {line2[6] = c1;  line2[7] = c2;   line2[8] = c3;}
      if (p[param].decimal == 1) {line2[5] = c1;  line2[6] = c2;   line2[7] = '.'; line2[8] = c3;}
      if (p[param].decimal == 2) {line2[5] = c1;  line2[6] = '.';  line2[7] = c2;  line2[8] = c3;}
      if (p[param].decimal == 3) {line2[4] = '0'; line2[5] = '.';  line2[6] = c1;  line2[7] = c2; line2[8] = c3;}

      #if defined(LCD_TEXTSTAR)
        LCDprint(0xFE);LCDprint('L');LCDprint(1);LCDprintChar(line1); //refresh line 1 of LCD
        LCDprint(0xFE);LCDprint('L');LCDprint(2);LCDprintChar(line2); //refresh line 2 of LCD
      #else
        LCDprint(0xFE);LCDprint(128);LCDprintChar(line1);
        LCDprint(0xFE);LCDprint(192);LCDprintChar(line2);
        i2c_LCD_move(0x00);i2c_LCD_puts(line1);  // add for i2c LCD 2011.04.10 Y.Mita    ←(これを追加)
        i2c_LCD_move(0x40);i2c_LCD_puts(line2);  // add for i2c LCD 2011.04.10 Y.Mita    ←(これを追加)
      #endif
      refreshLCD=0;
    }

(以降、長いので、省略)



後は、コンパイルして書き込みすれば動作します。

なお、動作はシリアル接続の表示と同じ。ラダー最右+エレベータ最押で設定開始し、エレベータ前後で項目選択、エルロン左右で数値修正。ラダー最左+エレベータ最押で設定終了し、変更を保存。
シリアル接続表示も同時接続可能です。

追記:
書き忘れていました!
液晶表示のコントラスト調整は、追加したI2C液晶の表示用関数の途中にある、以下の数値を変更してください。
byte contrast = 20;  // 0-63 at 5V system, set very small value
表示が薄いと動作していない様に見えたり、真っ黒で壊れた様に見えます。

  1. 2011/04/15(金) 01:00:45|
  2. ラジコン|
  3. トラックバック:0|
  4. コメント:2
<<強風でも面白い? | ホーム | トライコプターで、編集・アップが遅れた動画>>

コメント

何が書いてあるのかすら解らない凄さ(笑)
トライコプターは奥が深そうですね。
電子系自作の 極み!?
ロボットでも開発してるんじゃないかと思ってしまいます(笑)
安定するといいですね!
  1. 2011/04/19(火) 21:56:23 |
  2. URL |
  3. ケンタロー #-
  4. [ 編集]

ケンタローさん、いつもご訪問、コメントありがとうございます!
>何が書いてあるのかすら解らない凄さ(笑)
解らなくても飛ぶので大丈夫ですよ!
>トライコプターは奥が深そうですね。
確かに制御の面白さはたっぷりあるかも?
>電子系自作の 極み!?ロボットでも開発してるんじゃないかと思ってしまいます(笑)
こちらアンテナ村には異常な変○達が時々集まるので、私なぞまだまだ!4枚、6枚、8枚、ダクト等々、○態が一杯!
>安定するといいですね!
ありがとうございます!一つ解った事。「プロペラはケチらない。」...笑!
  1. 2011/04/21(木) 20:27:47 |
  2. URL |
  3. Y.Mita #-
  4. [ 編集]

コメントの投稿

管理者にだけ表示を許可する

トラックバック

トラックバックURLはこちら
http://ymita.blog9.fc2.com/tb.php/979-182c6479
上記広告は1ヶ月以上更新のないブログに表示されています。新しい記事を書くことで広告を消せます。