2014年12月7日日曜日

EMOTO 103LB Display

 EMOTOのローテータ表示部が壊れたため、Arduino UNOで表示部を製作した。モータコントロール部は、正常動作していたので、コントロール機能はなく、位置表示のみとした。LCDは、公開済のI2C制御方式とし、配線量を減らした。故障した103LBの機械式表示部は、全て取り外し、電源とコントロールスイッチのみ流用。
 コントローラ内部写真である。機械式表示器で使っていた、PCB、歯車、ポテンションメータなどを外し、Arduino UNOとPower PCBを組み込んだ。
   全体の回路図。I2Cを含め書いて有るので見通しが良いと思う。













Program

ローテータの位置情報(600Ωのポテンションメータ)をADCで読み、角度変換のみである。個体差が有る所は、AD値のRock to Rock(0~360°で1023~171)である。現物合わせ的な処理となっている。(やっつけ仕事)

//////////////////////////////////////////////////////////////////////
//  EMOTO 103LB control display program ver.1.0
//
//    Copyright(C)2014.JA2GQP.All rights reserved.
//
//                                                  2014/12/5
//                                                  JA2GQP
//////////////////////////////////////////////////////////////////////

#include <Wire.h>
#include <LiquidCrystal_I2C.h>

LiquidCrystal_I2C lcd(0x27,16,2);  // set the LCD address to 0x27 for
                                        // a 16 chars and 2 line display
int val=0;
int ang=0;
float wk1,wk2,wk3;

void setup()
{
  lcd.init();                          // initialize the lcd
  lcd.backlight();                    // LCD backlight on
  lcd.setCursor(5,1);
  lcd.print("JA2GQP");
}

void loop()
{
// analog read
  val=analogRead(0);               // Current position read
  delay(100);

// 0-360 degree convert
  wk1=val;
  wk1=1023.0-wk1;                 // AD max
  wk2=360.0/(1023.0-171.0);      // Per 1 degree resolution
  wk3=wk1*wk2;
  ang=wk3;

// angle display
  lcd.setCursor(3,0);
  lcd.print("    ");
  lcd.setCursor(3,0);
  lcd.print(ang);

// Orientation check
  switch(val){
      case 169:
      case 170:
      case 171:
      case 172:
      case 173:
        lcd.setCursor(0,0);
        lcd.print("N");
        break;
      case 276:
      case 277:
      case 278:
      case 279:
      case 280:
        lcd.setCursor(0,0);
        lcd.print("NW");
        break;
      case 382:
      case 383:
      case 384:
      case 385:
      case 386:
        lcd.setCursor(0,0);
        lcd.print("W");
        break;
      case 489:
      case 490:
      case 491:
      case 492:
      case 493:
        lcd.setCursor(0,0);
        lcd.print("SW");
        break;
      case 595:
      case 596:
      case 597:
      case 598:
      case 599:
        lcd.setCursor(0,0);
        lcd.print("S");
        break;
      case 702:
      case 703:
      case 704:
      case 705:
      case 706:
        lcd.setCursor(0,0);
        lcd.print("SE");
        break;
      case 808:
      case 809:
      case 810:
      case 811:
      case 812:
        lcd.setCursor(0,0);
        lcd.print("E");
        break;
      case 915:
      case 916:
      case 917:
      case 918:
      case 919:
        lcd.setCursor(0,0);
        lcd.print("NE");
        break;
      case 1023:
        lcd.setCursor(0,0);
        lcd.print("N");
        break;
      default:
        lcd.setCursor(0,0);
        lcd.print("   ");
  }
 
// Limit check
  switch(val){
      case 169:
      case 170:
      case 171:    
        lcd.setCursor(11,0);
        lcd.print("R-OVR");           // Right over
        break;
      case 1023:
        lcd.setCursor(11,0);
        lcd.print("L-OVR");           // Left over
        break;
      default:
        lcd.setCursor(11,0);
        lcd.print("     ");
  }

}


0 件のコメント: