大人の科学マガジン vol.27 「ジャパニーノ」(その3)P.O.Vの文字を綺麗に表示する。
Posted by arms22 on 2010年05月28日

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)
posted with amazlet at 10.05.28
大人の科学マガジン編集部
学習研究社
売り上げランキング: 179
学習研究社
売り上げランキング: 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
0 Comments
Leave a reply
該当の記事は見つかりませんでした。