0

EnergiaでMSP430 LaunchPadの内蔵温度センサーを読む

Energiaで450円のMSP430 LaunchPadがArduino化したので、内蔵の温度センサを読んで摂氏に変換してみた。

ボード : MSP430 LauncPad
マイコン : MSP430G2553
プログラム環境 : Energia


プログラム

温度を計ってシリアル通信でパソコンに送る。
内蔵電圧を1.5Vとして計算しているけど、実際は1.41~1.59Vらしいので精度はあきらめた。もともとチップ内部に封入されているし、きちんと気温を計るためのものではない。
https://github.com/shokai/energia-study/tree/master/temperature_serial
int ad;
double temp;
bool led_stat = false;

void setup() {
pinMode(GREEN_LED, OUTPUT);
Serial.begin(9600);
analogReference(INTERNAL1V5); // 内蔵1.5Vを基準にする
// analogReference(DEFAULT);
analogRead(TEMPSENSOR); // 最初の1回目のAD変換は正確に取れないので、捨てる
}

void loop() {
delay(1000);
ad = analogRead(TEMPSENSOR);
Serial.print("ad:");
Serial.println(ad);

temp = 1.5/1024*(ad-673)/0.00355; // 電圧を温度に変換
Serial.print("temp:");
Serial.println(temp);

digitalWrite(GREEN_LED, led_stat);
led_stat = !led_stat;
}


結果

ad:711
temp:15.68
ad:712
temp:16.09
ad:710
temp:15.27
ad:714
temp:16.92

けっこうブレるので10回ぐらい読んで平均を取ったりしたほうが良さそう
ちなみにLM35DZで計った気温は19度だった。


しばらく冷蔵庫に入れた後は
ad:680
temp:2.89
ad:681
temp:3.30
ad:683
temp:4.13
ad:681
temp:3.30
ad:681
temp:3.30


調査

white clouds: MSP430 温度計
同じボードでmsp-gccでやっているけど、同じ要領でEnergiaで書いたらADコンバータから全然違う数値がでてきた。
AD変換の比較電圧が違う気がする。
正しければ、摂氏0度の時に673が出てくるらしい。

Energia/examples/3.Analog/AnalogInput_InternalThermometer_430/AnalogInput_InternalThermometer_430.ino at master · energia/Energia
華氏で計算している。

Using the internal temperature sensor – Code vault – 43oh
華氏で計算している。
analogReference(INTERNAL1V5);
というのが気になる。

hardware/msp430/cores/msp430/Energia.h で定義されていた
DEFAULT SREF_0
INTERNAL1V5 SREF_1 + REFON
INTERNAL2V5 SREF_1 + REFON + REF2_5V
EXTERNAL SREF_2


データシートを見る
16ビット・超低消費電力マイコン MSP430™ – バリュー・ライン – MSP430G2553 – TI
40ページより、温度センサの仕様。1℃ごとに3.55mV増える。

38ページより、ADコンバータの仕様。レジスタの設定しだいで内蔵1.5Vか2.5になる。
外部電圧を参照するなら5,6番ピンを使う。


というわけでこうなった
analogReference(INTERNAL1V5);
int ad = analogRead(TEMPSENSOR);
double temp = 1.5/1024*(ad-673)/0.00355;
Serial.println(temp);

1

Energiaで450円のMSP430 LaunchPadがArduino化した

githubでMSP430 LaunchPadのコードを漁っていたら、Energiaという1年ぐらい前にArduino IDEからforkしたプロジェクトを見つけた。
全然関係ないCPUにArduinoの全命令を移植してあって、メチャクチャ出来が良いのでテンション上がって気合入れた記事書いてしまった。学校の教材として使えるレベルのマイコン環境だと思う。


Energiaのgitリポジトリはここ https://github.com/energia/Energia
試しに作ったプログラムはここ https://github.com/shokai/energia-study


1つ前の記事で書いたMSP430 LaunchPadで、Arduinoのコードが動く。
Arduino系は一番安いSeeduino v2でも1900円するので、もったいなくて1つのボードに色々な機能をがんばって実装するからプログラムが凄いことになってしまう。
MSP430 LaunchPadは共立エレショップで450円で買えるボードなので、ポンポン使い捨てできそうでとても良い。
そもそもRaspberry Piの値段に対してArduinoが高くて何やってんだろ感があって・・・


使ってみた

Getting Started · energia/Energia Wikiを見ながらやった。

http://energia.nu/download/に各OS用のEenrgia IDEとUSBドライバがある。
Mac用をインストールした。USBドライバは前の記事で書いたのと同じ奴だった。
commit logを見るとわりと頻繁に最新のArduinoからmergeしていて、IDEの日本語化も済んでた。
書き込む前に、Energiaの”ツール”メニューからシリアルポート、マイコンボード、書込装置を指定するのを忘れずに。

LEDを交互に点滅させながらAD変換器で明るさを取得し、シリアル通信でMacに送信するプログラムを作ってみた。
サンプルスケッチが大量に入っていたので特に困らなかった。

あっさり動いた。

(上の動画ではSerialPort Serverを使ってフルスクリーンターミナルに表示させている)


サーボモーターも回転させてみた。Known Issuesに乱数系が未実装とあったので、ランダムに動かすのではなく0度と180度を行ったり来たりさせた。
450円のUSB接続サーボコントローラとか、webカメラ回転させたりとかに便利そう。




プログラミング

Hardware · energia/Energia Wiki にピンアサイン情報がある。
各ピンはArduinoと同じく1~20の通し番号が付いていてそれをプログラム上でも使うのだが、基板上の刻印のとおりのP1_0やP2_5といったわかりやすい名前も使える。
P1_系の8本が10bitAD変換器になっている。PWMは7個だが、他のピンからもソフトウェアPWMが出せる。

基板上の赤いLEDや緑色のLEDはP1_0とP1_6に接続されているが、RED_LED・GREEN_LEDというわかりやすい名前でもアクセスできる。プッシュスイッチもPUSH2になってる。
マイコンに温度センサーが内蔵されていて、TEMPSENSORという名前でアクセスできる。ADコンバーターで読んだら309~311の値が返ってきた。450円のUSB温度計としても使えそう。

もっと詳しい情報は付属の2つのマイコン2553と2452のデータシートを見るとよい。
16ビット・超低消費電力マイコン MSP430™ – バリュー・ライン – MSP430G2553 – TI
16ビット・超低消費電力マイコン MSP430™ – バリュー・ライン – MSP430G2452 – TI

LED点滅

まず動作確認のために、基板上の赤と緑のLEDを交互に点滅させた。
https://github.com/shokai/energia-study/tree/master/led_blink
boolean led_stat;

void setup() {
pinMode(RED_LED, OUTPUT);
pinMode(GREEN_LED, OUTPUT);
led_stat = false;
}

void loop() {
digitalWrite(RED_LED, led_stat);
digitalWrite(GREEN_LED, !led_stat);
led_stat = !led_stat;
delay(1000);
}

シリアル通信

Mac上では /dev/tty.uart-48FF466E374B0C17 として認識されていた。
上の画像の通り、MSP430 LaunchPadに最初から刺さっているマイコンMSP430G2553を使う場合はジャンパピンRXD/TXDを横向きに付け直さなければならない。
箱に入ってるもう一個のマイコン MSP430G2452の場合はジャンパピンはそのままでいい。

LEDを点滅させつつシリアル通信を送受信した。Macから送った文字をMSP430からエコーしている。
https://github.com/shokai/energia-study/tree/master/serial_echo
boolean led_stat;

void setup() {
pinMode(RED_LED, OUTPUT);
pinMode(GREEN_LED, OUTPUT);
led_stat = false;
Serial.begin(9600);
}

void loop() {
while(Serial.available()){
Serial.print("echo : ");
Serial.write(Serial.read());
Serial.println("");
}
digitalWrite(RED_LED, led_stat);
digitalWrite(GREEN_LED, !led_stat);
Serial.println(led_stat ? "RED" : "GREEN");
led_stat = !led_stat;
delay(1000);
}


ADコンバータ

シリアル通信でAD変換値を送るプログラム。Analog 7 (P1_7)にCdSを接続した。
https://github.com/shokai/energia-study/tree/master/adc_serial
boolean led_stat;
int ad;

void setup() {
pinMode(RED_LED, OUTPUT);
pinMode(GREEN_LED, OUTPUT);
led_stat = false;
Serial.begin(9600);
}

void loop() {
digitalWrite(RED_LED, led_stat);
digitalWrite(GREEN_LED, !led_stat);
ad = analogRead(A7);
Serial.println(ad);
led_stat = !led_stat;
delay(100);
}


ソフトウェア・ハードウェアPWM

https://github.com/shokai/energia-study/tree/master/led_pwm

LEDの光量をPWMでフェードさせた。
ハードウェアPWMは上の図の紫色のピンで使えるんだけど、それ以外のピンでanalogWriteするとソフトウェアPWMが使われるらしい。
緑のLEDはなめらかなハードウェアPWMで、赤LEDはソフトウェアPWMになった。赤はあまり綺麗じゃなかった。
void setup() {
}

void loop() {
for(unsigned char i = 0; i < 255; i++){
analogWrite(GREEN_LED, i);
analogWrite(RED_LED, 255-i);
delay(3);
}
for(unsigned char i = 255; i > 0; i--){
analogWrite(GREEN_LED, i);
analogWrite(RED_LED, 255-i);
delay(3);
}
}


サーボモータを動かす

https://github.com/shokai/energia-study/tree/master/servo
この記事の冒頭に書いた動画のやつ。
Servo.hを読み込んで、P2_3にサーボを接続した。ソフトウェアPWMなピンだけど問題なく動いてる。

#include <Servo.h>

Servo servo;
boolean led_stat;
int ad;

void setup() {
pinMode(RED_LED, OUTPUT);
pinMode(GREEN_LED, OUTPUT);
led_stat = false;
Serial.begin(9600);
servo.attach(P2_3);
}

void loop() {
digitalWrite(RED_LED, led_stat);
digitalWrite(GREEN_LED, !led_stat);
led_stat = !led_stat;
servo.write(led_stat ? 0 : 180);
delay(1000);
}


不具合

Energia IDEを複数開く。プログラムをMSP430に書き込んでいる時に別のEnergia IDEのウィンドウをアクティブにすると、そっちも同時に書き込みを始めてしまう。特にサンプルスケッチをたくさん開いていると暴発しがち。別ウィンドウを触らないように気をつけるしかない。


シリアル通信するプログラムを書き込んだMSP430に、もう一度プログラムを書き込むと
usbutil: unable to find a device matching 0451:f432
というエラーが出て書き込めない。(「マイコンボードへの書き込みが完了しました」という表示は出るが、書き込めていない)
MSP430をUSBから抜き差しすると書き込めるようになる。
Energia IDEのシリアルターミナルから通信を見た後だけ起こって、他のシリアル通信モニタソフトで見た場合は起こらない不具合なので、単にEnergia IDEがシリアルポートを開放し忘れているだけだと思われる。


Macで動いてるVMWare上のUbuntuにMSP430 LaunchPadを接続しようとしたら、そのデバイスIDは既に他のマシンで使われているというメッセージが出て接続できなかった。もともとUSBドライバはデバイスIDを自分で適当に書いてビルドしろという、よくわからない仕様だったのでそのせいかもしれない。