なんかいろいろこんぴゅーたかんけいのなぐりがき

なんか勉強しているこんぴゅーた関係のことのメモやそれ以外のことを書こうかなあ...

logs

スポンサーサイト

上記の広告は1ヶ月以上更新のないブログに表示されています。
新しい記事を書く事で広告が消せます。

BarLEDをつかってCPU使用率メータ

 BarLEDを秋月電子通商で買ったので、以前つくったコードを利用して、CPU使用率メータを作ってみた。

P1080595.jpg


 まずはArduinoのコード


#4~13番のピンにバーLEDをつないでいる。
int i=0;
int cpu = 0;
void setup() {
// initialize the digital pin as an output:
Serial.begin(9600);
for(i=4;i<=13;i++) pinMode(i,OUTPUT);
}

// the loop() method runs over and over again,
// as long as the Arduino has power

void loop()
{
if(Serial.available()>0)
{
cpu = Serial.read();
//Serial.print(cpu,BYTE);
setBars(cpu);

}

delay(100);

}
void setBars(int x)
{
for(i=4;i<=13;i++)
{
digitalWrite(i,LOW);
}

for(i=13;i>13-x;i--)
{
digitalWrite(i,HIGH);
}

}


次がpython側。動かすには
http://code.activestate.com/recipes/576631/
↑のサイトに載っているコードをコピぺして、cpu.pyという名前で保存し、main.pyと同じフォルダに置いておかなければならない。ちなみに起動はpython main.py で起動する。


#main.py

from cpu import *
import time
import serial

qcut = QueryCPUUsageThread()
ser = serial.Serial(3)

while True:
g_cpu_usage = qcut.getCPUUsage()
print g_cpu_usage
ser.write(chr(g_cpu_usage))
time.sleep(3)


ただ、このパイソンのプログラムはPCがスリープするとうまく動作しなくなり、コマンドプロンプトが言うことをきかなくなったりするのでこのままではあんまり実用的でない。
スポンサーサイト

ATmega328Pで自作Arduino


今日はATmega328とかコンデンサとか使ってブレッドボードにArduinoを自作した。

作り方は、ニコニコ動画で見つけたコレ↓に詳しく説明されている。



上の動画は非常に分かりやすいが、自分が今回作っていてつまずいたところをメモしておく。

電解コンデンサの向き:アノード(足が長いほう)を+にカソード(足が短いほう)をGNDに差すとうまくいった。また、私の使用した電解コンデンサのアノードとカソードの足の長さの差が大きかったので足の短いカソード側がブレッドボードに刺さらなかったのでアノード側の足を少し爪切り(ニッパなんて持ってません)で切って、長さを調節した。

ブートローダを書き込むときの回路:
 http://www.geocities.jp/arduino_diecimila/avr-writer/index.html#top
上のURLのサイトに載っているスタンド・アローン・ライタの図を参考にして配線するとうまくいった。


Fuseに書き込む値:
 まずは配線が載っていた先のサイトを参考にソフトをダウンロードして、GUIのあるソフトを起動するわけで、Fuseの欄でReadボタンを押すと値が読まれ、ただしく配線できていることが分かるが、この値を書き換えてWriteボタンを押してFuseの値の書き換えをしなければならない。で早速Fuseって何?って状態になるわけだが、ググッてみると、Fuseはそれぞれ

hFuse->フューズビットHIGH
lFuse->フューズビットLOW
eFuse->フューズビットEx

のことで、それぞれ8ビットからなるフラグのようで、これらのビットを切り替えることでなにやらいろいろと設定をしているようだ。まあ細かいことはどうでもいい。知りたいことはArduinoに最初に乗っているATmega328ではどんな値がFuseに設定されているのかということ。

で、それも調べてみると、サイトによっては違う値を示している場合もあるが、いろいろなサイトを見て回った結果

hfuse = DA
lfuse = FF
efuse = 05
unlock = 3F
lock = 0F

が正しいと思う。(もちろん保障はしない)

lock,unlockていうのはどうやらLock Bit欄でWriteすることにより、何かをロックできるようだが、多分きちんと設定しなくてもLockBitはなんとかなりそう。

ブートローダを書き込み中にフリーズする:
 Command line Option を -P ft0 にしていますか?
 私の場合 -P ft0 -B 4800 のままにしてる書き込み途中にフリーズした


このやりかたで、16MHzになっているのか?:
 ATmegaは出荷された時点では低速モードの8MHzになっているらしい、でもArduinoに乗っているAtmega328は16MHzで動作している、ということで、自作するArduinoも16MHzにしたい。ということなんだけど、この16MHzとか8MHzとかを設定はFuseの値で行うようなので、上のほうに書いたFuseの値をWriteしていれば多分16MHzで動くのでは、と思う。多分ね。



それで、今気づいたんだけど、上のほうにリンク張ったサイト、新しくなってた!!
しかもそこにはちゃんとATmega328Pの場合のFuse値とか載ってた!!!orz
http://www.geocities.jp/arduino_diecimila/bootloader/index.html


なんかむなくしなってきたし、まとめに入ろう。

 ATmega328とその他もろもろでArduinoを自作した。
 費用は、USB付で2000円くらい。USBはずして、ブレッドボードを使わずにユニバーサル基盤を使えば、1000円もいかないと思われる。つまり完成品を買うよりお得。ただし、配線が下手だと本物よりでかくなるorz。
 
 作成時間は3時間くらい。でもなれれば1時間もかからないだろう。ブートローダを焼くのが面倒だったらブートローダ導入済みのATmega328Pも売られているのでそれを買うのも手。500円くらいで買える。ちなみに今回使ったのはもちろんブートローダ未導入のもので、秋月で250円でした(安)。
 
 難易度は、電子工作を全くしたことがなかった私が、Arduinoを買って、Arduinoで遊んで(具体的にどんなことをしていたかはこのブログを読んでいってもらえば分かると思う。あたりまえだが、念のために言っておくと、私はArduinoとPCの通信でPythonを使っているが、Arduinoの自作にPythonの知識は全くいらない。)1週間たたないうちに作ってしまえるレベル。

 それでは最後に写真を貼って終わりということで。

P1080594.jpg

 

2つのLEDを光センサにしてゲーム?をする

毎度おなじみ、まずはArduino側のプログラム

int sencer = 2;
int sencer2 = 3;
double num = 0;
double num2 = 0;
int upnum = 0;
boolean flag1 = false;
boolean flag2 = false;
void setup()
{
Serial.begin(9600);
pinMode(13,OUTPUT);
}

void loop()
{
flag1 = flag2 = false;
num = analogRead(sencer);
num2 = analogRead(sencer2);

if(num <= 160)
{
digitalWrite(13,HIGH);
flag1 = true;
}
else
{
digitalWrite(13,LOW);
flag1 = false;
}
if(num2 <= 140)
{
flag2 = true;
}
else flag2 = false;

if(flag1 && flag2 || !flag1 && !flag2) upnum=0;
else if(flag1) upnum = 1;
else if(flag2) upnum = 2;
else upnum = 3;

Serial.print(upnum,DEC);

delay(50);
}

このプログラムはそれぞれのセンサ用LEDのアナログ入力が閾値を超えたか超えてないかをflag1,flag2で管理して両flagの状態に応じてPCに値を出力している。
また、確認用にflag1がTrueだと13ピンに電気がいくようにしている。



キャプチャ

で、Pythonで書いたゲームのようなもの。ただ円が画面を動くだけ。ただし動かし方がキーボードではなくLEDに手をかざしてLEDの電圧を下げて上プログラムで設定した閾値を超えさせて操作する。
手をかざすと、どんどん円が加速して動いていくはず、画面端にくるとバウンドするようにしている。

Pythonのほうのコードは今回もtxt拡張子で保存したのをアップしておく
shapes.txt

LEDが光センサになる

通常LEDは電圧を加えると発光するけど、逆にLEDに向けて光を加えると電圧が生じるという性質がある。

なので赤色LEDを光センサの代わりにして遊んでみた。

P1080591.jpg


LEDのカソードをGLDにアノードをアナログ入力につなげた。
それで、アナログ入力の値をとってみると値は暗くなるほど小さくなる。
なので閾値を設定(今回のばあい227)してこれより値が小さくなれば13ピンに電圧を与え、て別につないでおいたLEDを発光させるようにした。


つまり、暗くなると自動的に明るくなるアレである。

Arduino側

int sencer = 2;
double num = 0;
void setup()
{
Serial.begin(9600);
pinMode(13,OUTPUT);
}

void loop()
{
num = analogRead(sencer);
Serial.println(num,DEC);
if(num <= 227)
{
digitalWrite(13,HIGH);
}
else
{
digitalWrite(13,LOW);
}



delay(500);
}

まあ、これで実験を終わってもいいのだけど、センサとして利用しているLEDに手をかざして暗くするとコマンドプロンプト上の顔文字が右に動くようなプログラムを書いてみた。

LEDで遊ぶ


import serial
import time
ser = serial.Serial(3)
x = 5
while True:
num = int(ser.read(5))
if(num <=226):#when dim
x+=1
else:
x-=1
if x >20:
x = 20
elif x<0 :
x = 0

print " " * x,"(ToT)/"
time.sleep(0.5)

やっぱりインデントが無視されるんでファイルもあげとくtxtになってるんで落としてから.pyに拡張子を変更すること。
main_20091123121612.txt

温度計に機能+(CPU使用率表示)

さっき作った温度計に追加機能としてCPU使用率を十段階で表示させるプログラムを作ってみた。

Arduinoのプログラム

#define WAIT 25

boolean matrix[8][8]={
{0,0,0,1,1,0,0,0},
{0,0,1,0,0,1,0,0},
{0,1,0,0,0,0,1,0},
{0,1,0,0,0,0,1,0},
{0,1,0,0,0,0,1,0},
{0,1,1,1,1,1,1,0},
{0,1,0,0,0,0,1,0},
{0,1,0,0,0,0,1,0}
};
boolean niju[8][8] =
{
{ 0 , 1 , 1 , 0 , 0 , 1 , 1 , 0 },
{ 1 , 0 , 0 , 1 , 1 , 0 , 0 , 1 },
{ 1 , 0 , 0 , 1 , 1 , 0 , 0 , 1 },
{ 0 , 0 , 1 , 0 , 1 , 0 , 0 , 1 },
{ 0 , 1 , 0 , 0 , 1 , 0 , 0 , 1 },
{ 1 , 0 , 0 , 0 , 1 , 0 , 0 , 1 },
{ 1 , 0 , 0 , 0 , 1 , 0 , 0 , 1 },
{ 1 , 1 , 1 , 1 , 0 , 1 , 1 , 0 },
};
boolean sanju[8][8]=
{
{ 0 , 1 , 1 , 0 , 0 , 1 , 1 , 0 },
{ 1 , 0 , 0 , 1 , 1 , 0 , 0 , 1 },
{ 0 , 0 , 0 , 1 , 1 , 0 , 0 , 1 },
{ 0 , 1 , 1 , 0 , 1 , 0 , 0 , 1 },
{ 0 , 1 , 1 , 0 , 1 , 0 , 0 , 1 },
{ 0 , 0 , 0 , 1 , 1 , 0 , 0 , 1 },
{ 0 , 0 , 0 , 1 , 1 , 0 , 0 , 1 },
{ 1 , 1 , 1 , 0 , 0 , 1 , 1 , 0 },
};
boolean niju1[8][8]=
{
{ 0 , 1 , 1 , 0 , 0 , 0 , 1 , 0 },
{ 1 , 0 , 0 , 1 , 0 , 1 , 1 , 0 },
{ 1 , 0 , 0 , 1 , 0 , 0 , 1 , 0 },
{ 0 , 0 , 1 , 0 , 0 , 0 , 1 , 0 },
{ 0 , 1 , 0 , 0 , 0 , 0 , 1 , 0 },
{ 1 , 0 , 0 , 0 , 0 , 0 , 1 , 0 },
{ 1 , 0 , 0 , 0 , 0 , 0 , 1 , 0 },
{ 1 , 1 , 1 , 1 , 0 , 1 , 1 , 1 },
};
boolean niju2[8][8]=
{
{ 0 , 1 , 1 , 0 , 0 , 1 , 1 , 0 },
{ 1 , 0 , 0 , 1 , 1 , 0 , 0 , 1 },
{ 1 , 0 , 0 , 1 , 1 , 0 , 0 , 1 },
{ 0 , 0 , 1 , 0 , 0 , 0 , 1 , 0 },
{ 0 , 1 , 0 , 0 , 0 , 1 , 0 , 0 },
{ 1 , 0 , 0 , 0 , 1 , 0 , 0 , 0 },
{ 1 , 0 , 0 , 0 , 1 , 0 , 0 , 0 },
{ 1 , 1 , 1 , 1 , 1 , 1 , 1 , 1 },
};
boolean niju3[8][8]=
{
{ 0 , 1 , 1 , 0 , 0 , 1 , 1 , 0 },
{ 1 , 0 , 0 , 1 , 1 , 0 , 0 , 1 },
{ 1 , 0 , 0 , 1 , 0 , 0 , 0 , 1 },
{ 0 , 0 , 1 , 0 , 0 , 1 , 1 , 0 },
{ 0 , 1 , 0 , 0 , 0 , 1 , 1 , 0 },
{ 1 , 0 , 0 , 0 , 0 , 0 , 0 , 1 },
{ 1 , 0 , 0 , 0 , 1 , 0 , 0 , 1 },
{ 1 , 1 , 1 , 1 , 0 , 1 , 1 , 0 },
};
boolean niju4[8][8]=
{
{ 0 , 1 , 1 , 0 , 0 , 0 , 1 , 0 },
{ 1 , 0 , 0 , 1 , 0 , 1 , 1 , 0 },
{ 1 , 0 , 0 , 1 , 1 , 0 , 1 , 0 },
{ 0 , 0 , 1 , 0 , 1 , 1 , 1 , 1 },
{ 0 , 1 , 0 , 0 , 0 , 0 , 1 , 0 },
{ 1 , 0 , 0 , 0 , 0 , 0 , 1 , 0 },
{ 1 , 0 , 0 , 0 , 0 , 0 , 1 , 0 },
{ 1 , 1 , 1 , 1 , 0 , 0 , 1 , 0 },
};
boolean niju5[8][8]=
{
{ 0 , 1 , 1 , 0 , 1 , 1 , 1 , 1 },
{ 1 , 0 , 0 , 1 , 1 , 0 , 0 , 0 },
{ 1 , 0 , 0 , 1 , 1 , 0 , 0 , 0 },
{ 0 , 0 , 1 , 0 , 1 , 1 , 1 , 1 },
{ 0 , 1 , 0 , 0 , 0 , 0 , 0 , 1 },
{ 1 , 0 , 0 , 0 , 0 , 0 , 0 , 1 },
{ 1 , 0 , 0 , 0 , 0 , 0 , 0 , 1 },
{ 1 , 1 , 1 , 1 , 1 , 1 , 1 , 1 },
};
boolean niju6[8][8]=
{
{ 0 , 1 , 1 , 0 , 0 , 0 , 0 , 1 },
{ 1 , 0 , 0 , 1 , 0 , 0 , 1 , 0 },
{ 1 , 0 , 0 , 1 , 0 , 1 , 0 , 0 },
{ 0 , 0 , 1 , 0 , 1 , 1 , 0 , 0 },
{ 0 , 1 , 0 , 0 , 1 , 0 , 1 , 0 },
{ 1 , 0 , 0 , 0 , 1 , 0 , 0 , 1 },
{ 1 , 0 , 0 , 0 , 1 , 0 , 0 , 1 },
{ 1 , 1 , 1 , 1 , 0 , 1 , 1 , 0 },
};
boolean niju7[8][8]=
{
{ 0 , 1 , 1 , 0 , 1 , 1 , 1 , 1 },
{ 1 , 0 , 0 , 1 , 1 , 0 , 0 , 1 },
{ 1 , 0 , 0 , 1 , 1 , 0 , 0 , 1 },
{ 0 , 0 , 1 , 0 , 0 , 0 , 0 , 1 },
{ 0 , 1 , 0 , 0 , 0 , 0 , 1 , 0 },
{ 1 , 0 , 0 , 0 , 0 , 0 , 1 , 0 },
{ 1 , 0 , 0 , 0 , 0 , 0 , 1 , 0 },
{ 1 , 1 , 1 , 1 , 0 , 0 , 1 , 0 },
};
boolean niju8[8][8]=
{
{ 0 , 1 , 1 , 0 , 1 , 1 , 1 , 1 },
{ 1 , 0 , 0 , 1 , 1 , 0 , 0 , 1 },
{ 1 , 0 , 0 , 1 , 1 , 0 , 0 , 1 },
{ 0 , 0 , 1 , 0 , 1 , 1 , 1 , 1 },
{ 0 , 1 , 0 , 0 , 1 , 0 , 0 , 1 },
{ 1 , 0 , 0 , 0 , 1 , 0 , 0 , 1 },
{ 1 , 0 , 0 , 0 , 1 , 0 , 0 , 1 },
{ 1 , 1 , 1 , 1 , 1 , 1 , 1 , 1 },
};
boolean niju9[8][8]=
{
{ 0 , 1 , 1 , 0 , 1 , 1 , 1 , 1 },
{ 1 , 0 , 0 , 1 , 1 , 0 , 0 , 1 },
{ 1 , 0 , 0 , 1 , 1 , 0 , 0 , 1 },
{ 0 , 0 , 1 , 0 , 1 , 1 , 1 , 1 },
{ 0 , 1 , 0 , 0 , 0 , 0 , 0 , 1 },
{ 1 , 0 , 0 , 0 , 0 , 0 , 1 , 0 },
{ 1 , 0 , 0 , 0 , 0 , 1 , 0 , 0 },
{ 1 , 1 , 1 , 1 , 1 , 0 , 0 , 0 },
};
boolean zero[8][8]=
{
{ 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 },
{ 0 , 1 , 1 , 0 , 1 , 0 , 0 , 1 },
{ 1 , 0 , 0 , 1 , 1 , 0 , 1 , 0 },
{ 1 , 0 , 0 , 1 , 1 , 1 , 0 , 0 },
{ 1 , 0 , 0 , 1 , 1 , 1 , 0 , 0 },
{ 1 , 0 , 0 , 1 , 1 , 0 , 1 , 0 },
{ 0 , 1 , 1 , 0 , 1 , 0 , 0 , 1 },
{ 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 },
};
boolean one[8][8]=
{
{ 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 },
{ 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 },
{ 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 },
{ 0 , 1 , 1 , 1 , 1 , 1 , 1 , 0 },
{ 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 },
{ 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 },
{ 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 },
{ 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 },
};
boolean two[8][8]=
{
{ 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 },
{ 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 },
{ 0 , 0 , 1 , 1 , 1 , 1 , 0 , 0 },
{ 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 },
{ 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 },
{ 0 , 1 , 1 , 1 , 1 , 1 , 1 , 0 },
{ 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 },
{ 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 },
};
boolean three[8][8]=
{
{ 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 },
{ 0 , 0 , 1 , 1 , 1 , 1 , 0 , 0 },
{ 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 },
{ 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 },
{ 0 , 0 , 1 , 1 , 1 , 1 , 0 , 0 },
{ 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 },
{ 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 },
{ 0 , 1 , 1 , 1 , 1 , 1 , 1 , 0 },
};
boolean four[8][8]=
{
{ 1 , 1 , 1 , 1 , 1 , 1 , 1 , 1 },
{ 1 , 0 , 0 , 1 , 1 , 0 , 0 , 0 },
{ 1 , 0 , 0 , 1 , 0 , 1 , 0 , 1 },
{ 1 , 0 , 1 , 0 , 0 , 1 , 0 , 1 },
{ 1 , 1 , 0 , 0 , 0 , 0 , 1 , 1 },
{ 1 , 0 , 0 , 0 , 0 , 0 , 0 , 1 },
{ 1 , 0 , 0 , 0 , 0 , 0 , 0 , 1 },
{ 1 , 1 , 1 , 1 , 1 , 1 , 1 , 1 },
};


boolean five[8][8]=
{
{ 0 , 1 , 1 , 1 , 1 , 1 , 1 , 0 },
{ 0 , 0 , 0 , 1 , 0 , 0 , 0 , 0 },
{ 0 , 0 , 1 , 0 , 0 , 0 , 0 , 0 },
{ 0 , 1 , 1 , 1 , 1 , 1 , 0 , 0 },
{ 0 , 0 , 1 , 0 , 0 , 1 , 0 , 0 },
{ 0 , 0 , 1 , 0 , 0 , 1 , 0 , 0 },
{ 0 , 1 , 0 , 0 , 0 , 1 , 0 , 0 },
{ 1 , 1 , 1 , 1 , 1 , 1 , 1 , 1 },
};
boolean six[8][8]=
{
{ 0 , 0 , 0 , 1 , 0 , 0 , 0 , 0 },
{ 0 , 0 , 0 , 1 , 0 , 0 , 0 , 0 },
{ 0 , 1 , 1 , 1 , 1 , 1 , 1 , 0 },
{ 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 },
{ 0 , 0 , 1 , 0 , 0 , 1 , 0 , 0 },
{ 0 , 0 , 1 , 0 , 0 , 1 , 0 , 0 },
{ 0 , 1 , 0 , 0 , 0 , 0 , 1 , 0 },
{ 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 },
};
boolean seven[8][8]=
{
{ 0 , 0 , 1 , 0 , 0 , 0 , 0 , 0 },
{ 0 , 0 , 1 , 0 , 0 , 0 , 0 , 0 },
{ 0 , 1 , 1 , 1 , 1 , 1 , 1 , 0 },
{ 0 , 0 , 1 , 0 , 0 , 0 , 0 , 0 },
{ 0 , 0 , 1 , 0 , 0 , 0 , 0 , 0 },
{ 0 , 0 , 1 , 0 , 0 , 0 , 0 , 0 },
{ 0 , 0 , 0 , 1 , 1 , 1 , 1 , 0 },
{ 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 },
};
boolean eight[8][8]=
{
{ 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 },
{ 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 },
{ 0 , 0 , 0 , 1 , 0 , 1 , 0 , 0 },
{ 0 , 0 , 1 , 0 , 0 , 1 , 0 , 0 },
{ 0 , 0 , 1 , 0 , 0 , 1 , 0 , 0 },
{ 0 , 1 , 0 , 0 , 0 , 0 , 1 , 0 },
{ 1 , 0 , 0 , 0 , 0 , 0 , 0 , 1 },
{ 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 },
};
boolean nine[8][8]=
{
{ 0 , 0 , 1 , 0 , 0 , 0 , 0 , 0 },
{ 0 , 0 , 1 , 0 , 0 , 0 , 0 , 0 },
{ 0 , 1 , 1 , 1 , 1 , 0 , 0 , 0 },
{ 0 , 0 , 1 , 0 , 1 , 0 , 0 , 0 },
{ 0 , 0 , 1 , 0 , 1 , 1 , 0 , 0 },
{ 0 , 0 , 1 , 0 , 0 , 1 , 0 , 0 },
{ 0 , 1 , 0 , 0 , 0 , 1 , 0 , 0 },
{ 1 , 0 , 0 , 0 , 0 , 0 , 1 , 1 },
};
boolean ten[8][8]=
{
{ 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 },
{ 0 , 0 , 0 , 1 , 0 , 0 , 0 , 0 },
{ 0 , 0 , 0 , 1 , 0 , 0 , 0 , 0 },
{ 0 , 0 , 0 , 1 , 0 , 0 , 0 , 0 },
{ 0 , 0 , 0 , 1 , 0 , 0 , 0 , 0 },
{ 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 },
{ 0 , 0 , 0 , 1 , 0 , 0 , 0 , 0 },
{ 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 },
};


int sencer = 5;
double num = 0;
double temp = 0;
int count=0;
int cpu=0;
int switch_count=0;
void setup(){
Serial.begin(9600);
for(int i=2;i<=18;i++){
pinMode(i,OUTPUT);
digitalWrite(i,LOW);
}
}
void loop(){
count++;
switch_count++;
digitalWrite(18,LOW);
if(count>=25 && switch_count>=WAIT)
{
num = analogRead(sencer);
num = num*5;
temp = (num - 424) / 6.25;
Serial.println(temp,DEC);
count=0;
}
if(switch_count>=WAIT)
{
switch((int)temp)
{
case 20:showMatrix(niju);break;
case 21:showMatrix(niju1);break;
case 22:showMatrix(niju2);break;
case 23:showMatrix(niju3);break;
case 24:showMatrix(niju4);break;
case 25:showMatrix(niju5);break;
case 26:showMatrix(niju6);break;
case 27:showMatrix(niju7);break;
case 28:showMatrix(niju8);break;
case 29:showMatrix(niju9);break;
case 30:showMatrix(sanju);break;
default:showMatrix(matrix);break;
}
}

if(Serial.available()>0)
{
cpu = Serial.read();
switch_count=0;
}
if(switch_count {
if(cpu <= 9 ) showMatrix(zero);
else if(cpu <=19) showMatrix(one);
else if(cpu <= 29) showMatrix(two);
else if(cpu <=39) showMatrix(three);
else if(cpu <=49) showMatrix(four);
else if(cpu <=59) showMatrix(five);
else if(cpu <=69) showMatrix(six);
else if(cpu <=79) showMatrix(seven);
else if(cpu <=89) showMatrix(eight);
else if(cpu <=99) showMatrix(nine);
else if(cpu >=100) showMatrix(ten);
digitalWrite(18,HIGH);
}


}


void showMatrix(boolean matrix[8][8])
{
for(int i=2;i<=9;i++){
digitalWrite(i,HIGH); //行:HIGHで点灯
for(int j=10;j<=17;j++){
if(matrix[i-2][j-10]==1){//点灯条件
digitalWrite(j,LOW); //列:LOWで点灯
}
//上のif文のかわりに以下でも可
//digitalWrite(j,!matrix[i-2][j-10]);

delayMicroseconds(300);//0.03秒点灯
digitalWrite(j,HIGH);//オフにする
}
digitalWrite(i,LOW);//オフにする
}
}

文字用配列のせいでやたら長いが前のプログラムと変わったのはシリアル通信の処理くらい。
あと、はCPU使用率と温度表示をスイッチして表示できるようにswitch_countという変数を利用している。そろそろ自分でもプログラムがどうなっているか分からなくなってきた。コメントいれてないから来週には自分でも読むのが大変になっているだろう。

で、次がPC側。今回もPythonで書いている
そういえばさっき気づいたが、このブログのテキストフィールドにPythonのソースコードをコピペしてもインデントが反映されないらしい。なので利用するときはインデントを手動でしれないといけない。どうやったらインデントを反映してこのブログにあげれるのだろう?
ん?ソースファイルごとアップすればいいのか。
ということでやってみます。


まずは、前回アップしたけどインデントがくずれているドットマトリックス配列メーカーのプログラム(今回のものとは関係ありません)
lmm.py

どうだろう、上のリンクから落としたファイルlmm.pyならインデントが壊れてないはずなので、TkinterとPythonインタプリタがあれば即実行できるはず。

それでは次に今回Arduinoにシリアル通信してCPUを制御したソースコード2つ。
main.py
cpu.py

同じディレクトリにいれて、mainのほうを実行してくれれば、処理が始まる。
Arduinoとのシリアル通信では1バイトずつASCIコードでやりとりしているようで、数字を送りたい場合はchr(num)でnumをに対応するアスキー文字を取得してそれをwriteすればよい。

Paging Navigation

Navigations, etc.

上記広告は1ヶ月以上更新のないブログに表示されています。新しい記事を書くことで広告を消せます。