2018年
1月
1 2 3 4 5 6
7 8 9 10 11 12 13
14 15 16 17 18 19 20
21 22 23 24 25 26 27
28 29 30 31

setup diary

2007|12|
2008|01|02|03|04|05|06|07|08|09|10|11|12|
2009|01|02|03|04|05|06|07|08|09|10|11|12|
2010|01|02|03|04|05|06|07|08|09|10|11|12|
2011|01|02|03|04|05|06|07|08|09|10|11|12|
2012|01|02|03|04|05|06|07|08|10|11|12|
2013|01|02|03|04|05|06|07|08|09|10|11|12|
2014|01|02|03|04|06|08|11|
2015|01|02|03|04|05|06|07|08|10|11|12|
2016|01|02|03|04|05|06|07|08|09|10|11|12|
2017|01|02|03|04|05|06|07|08|09|10|11|12|
2018|01|02|03|04|05|06|07|08|09|10|11|12|
2019|01|02|03|04|05|06|07|08|09|10|11|12|
2020|01|02|03|04|05|06|07|08|09|10|11|12|
2021|01|02|03|04|05|06|07|08|09|10|11|12|
2022|01|02|03|04|05|06|07|08|09|10|11|12|
2023|01|02|03|04|05|06|07|08|09|10|11|

2018-01-07 温度モニター

_ MsTimer2.hとWire.hを同時に使うときの注意点

年末年始に,arduino UNOを使った温度モニターを作ろうと思っていたが,時間が取れなった.ようやく時間ができたので,いろいろと試してみた.

I2Cで通信してADT7410から温度を取得する部分は,以前書いたプログラムを使えば良いと思っていたら,そのプログラムが実は間違っていたことが分かった.レジスタに格納されたデータを読み出すのだが,温度のデータは2byteで二つのレジスタに格納されている.これを1byteずつ読み出していたのだが,実は2byte一度に読み出さないといけなかったのだ.datasheetの一部を読んで1byteずつ取り出せば良いと解釈しまっていた.

一定の時間おきに,温度を測定するために,タイマーを使ってみた.MsTimer2.hを使ったのだが,MsTimer2::set(time,routine);でms単位の時間と呼び出すサブルーチンを指定して,MsTimer2::start();でタイマーをスタートするだけなので,問題無く動いた.しかし,タイマー割り込みの部分でi2cを読もうと思ったら,そこで止まってしまうことが分かった.調べてみると,i2cを読むWire.hでも,割り込みを使っているが,タイマーから割り込みがかかると,割り込みが禁止されてしまい,i2cが読めなくなっていることが分かった.そこで,タイマー割り込みがかかったときに,sei();を実行すれば,i2cもうまく読める.


2018-01-09 AVRからstm32へ

_ Linuxのarduinoでstm32

マイコンとしては,AVRの90s2313から始めて, tiny2313, tiny261, tiny861, mega8といくつかのAVRを使った後,半田付けが面倒になってarduino UNOやnanoの互換機を主に使うようになった.arduinoだと,AVRの性能のすべてを引き出すのが難しいが,いろいろなlibraryがあるので,短く手軽に書けるのは良いことだと思う.また,LANと通信したいときには,wifiを簡単に使えるESP8266を使うようになった.

今後はどのマイコンを使っていこうかと考えていたのだが,stm32の人気が出てきたので,私も少し使ってみた.stm32は,安価であるにも関わらず,32bitでsramやflashも比較的大きく,今後もより発展していく可能性を持っている.

今回,STM32F103C8T6を搭載したBlue Pillと呼ばれるボードを使ってみた.このボードは安いのだが,R10のチップ抵抗に誤った抵抗値の部品が使われており,これを訂正する必要がある.本来は1.5kであるべきところに,10kが載っていたので,2.2kを並列に追加して,1.8kにしておいた.

arduino UNOとかarduino nanoは,USBをserialに変換してからマイコンに接続されている.一方,stm32は,直接USBと接続されており,そのままではUSBを認識しないので,まずはbootloaderをインストールする必要がある.

bootloaderは,https://github.com/rogerclarkmelbourne/STM32duino-bootloader/tree/master/binariesからdownloadするが,今回のボードはLEDがPC13につながっているので,generic_boot20_pc13.binを選択する.また,書き込みするためのツールなどは,https://github.com/rogerclarkmelbourne/Arduino_STM32に含まれているので,一括でdownloadしておく. ここでは,手持ちのUSB-serialを使ってbootloaderをインストールすることにした.まず,ボード上のjumperを,上側を1,下側を0にする.そして,serialのGNDと3.3Vを接続し,RXDはA9と,TXDはA10と接続する.tools/linux/stm32flashにあるstm32flashを使って,

./stm32flash -w generic_boot20_pc13.bin -v /dev/ttyUSB0

として,書き込む.書き込み終わったら,jumperを両方共に0に戻しておく.それから,udevの設定をするために,tools/linuxの中のinstall.shを実行する.これで,PCからUSBを通して認識出来るようになった.

次にarduinoの設定だが,1.6.9以降を使って,board managerからarduino Dueを探して,インストールする.そして、hardwareの下にArduino_STM32 というフォルダを作って,先程downloadしたファイルをすべて置く.boardとしては,STM32F103C8を選べば良い.これで,arduinoからstm32が使えるようになるはずなのだが,resetがうまく働かないことが分かった.そこで,書き込む時には,3.3VとPC14を繋いでからresetしてperpetual bootloader modeしてから書き込むか,うまいタイミングでresetを押す必要がある.少し面倒だったが,stm32が使えるようになった.


2018-01-14 ADCの比較

_ arduino UNOとstm32 blue pillのADC

stm32のblue pillをarduinoから使えるようになったので、いろいろと試してみようと思っている。stm32に慣れていくために、arduino UNOと比較しながら、少しずつ勉強していこうと思う。

arduino UNOには、A0-A5の6本のアナログピンがあり、これらは10bitのADCとして使うことができる。5Vを最大値として、電圧を0-1023までの値として測定することができる。プログラムは、

void setup() {
  pinMode(PA0, INPUT_ANALOG);
  Serial.begin(9600);
}
void loop() {
  delay(1000);
  Serial.println(analogRead(PA0));
}

のようにすれば、良い。一方、blue pillでは、PA0-PA7とPB0-PB1の合計10本のピンがDCとして使うことができる。主な違いは、12bitであることと、最大値が3.3Vであることである。プログラムは、ピンの名前を変えるとそのまま使うことができる。ADCを詳細に設定するプログラムも作れるようだが、単に使うだけなら、これで良いだろう。