なんでも作っちゃう、かも。

Arduino/Make/フィジカルコンピューティング/電子工作あたりで活動しています。スタバの空きカップを使ったスタバカップアンプなど製作。最近はもっぱらArduinoと3Dプリンタの自作に興味があります。

大人の科学マガジン vol.27 「ジャパニーノ」(その3)P.O.Vの文字を綺麗に表示する。

Posted by arms22 on 2010年05月28日 0  1

Japanino特設サイトのP.O.Vのスケッチを改良して、P.O.Vのハンドルを速く回しても、遅く回しても文字が綺麗に表示されるようにしてみた。

※最初の15秒は改良前。


オリジナルのスケッチだとLEDの点灯時間が一定だから、LEDバーの動きが速い時はLEDの光が長く見え、遅い時はLEDの光が短く見える。そうすると文字が延びたり縮んだりして見えるわけだ。

そこでLEDバーの動きが速い時はLEDの点灯時間を短く、遅い時はLEDの点灯時間が長くなるようにして、見た目のLEDの光の長さを同じにすれば文字が綺麗に見えるようになる。

幸いP.O.Vの増速歯車の部分にはスイッチが付いていて、LEDバーが左側に来たらスイッチが押されるような仕組みになっている。このスイッチが押される間隔を計ればLEDバーの往復にかかった時間を求めることができる。往復時間を半分に割ると片道分の時間が得られる、さらにこれをP.O.Vで表示させたい幅分のドット数+余白ドットで割れば、1ドットあたりの点灯時間を求めることができる。



大人の科学マガジン Vol.27(8ビットマイコン) (Gakken Mook)
大人の科学マガジン編集部
学習研究社
売り上げランキング: 179



// Japanino POV by Musashinodenpa

#define LEDPIN 7     // どのピンからLEDをつなぐか
#define SWPIN  6     // スイッチをつなぐピン
#define WIDTH  20    // 表示する幅

// ビットマップ(画像)を定義
byte bitmap[] = {
  0b00000000,
  0b01000001,
  0b01111111,
  0b01000001,
  0b00000000,
  0b00000000,
  0b00001110,
  0b00011111,
  0b00111111,
  0b01111110,
  0b00111111,
  0b00011111,
  0b00001110,
  0b00000000,
  0b00000000,
  0b00111111,
  0b01000000,
  0b01000000,
  0b00111111,
  0b00000000,
};

unsigned long lastTime;
unsigned long aveTime;

void setup() {
  // LEDが接続されたピンを出力に設定します
  for(char pin = LEDPIN; pin < LEDPIN + 7; pin++) {
    pinMode(pin, OUTPUT);
  }
  pinMode(SWPIN, INPUT); // スイッチのピンを入力に
  digitalWrite(SWPIN, HIGH); // 内蔵プルアップ有効
}

void loop()
{
  // スイッチがオンならば1回描画
  if(digitalRead(SWPIN) == LOW) {
    unsigned long cur = millis();
    unsigned long dif = cur - lastTime;

    aveTime = (dif >> 1) + (dif >> 2) + (aveTime >> 2);
    lastTime = cur;

    if(aveTime > 500)
      aveTime = 500;

    unsigned short us = (aveTime * 500) / (WIDTH + 4);

    // すぐ始めると詰まって見えるのでちょっと待つ
    delayMicroseconds(us);
    delayMicroseconds(us);

    for(int pos=0; pos<WIDTH; pos++){
      for(int i = 0; i < 7; i++) { // ビットマップの高さの分だけ繰り返し
        // ビットマップデータから1ビットを取り出してピンの状態に反映
        digitalWrite(LEDPIN + 6 - i, (bitmap[pos] >> i) & 0b00000001);
      }
      // LEDが光っている時間
      delayMicroseconds(us);
    }
    for(int i = LEDPIN; i < LEDPIN + 7; i++) { // 全ドット、消灯
      digitalWrite(i, LOW);
    }
  }
}



Ads by Google

Leave a reply






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

該当の記事は見つかりませんでした。