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を自分で適当に書いてビルドしろという、よくわからない仕様だったのでそのせいかもしれない。

1

IOIO for Androidのアナログ入出力を試した

IOIOの10bit ADコンバータと10kHz PWM出力を試した。

今回のコード https://github.com/shokai/android-ioio-study/tree/master/AnalogInOut


Androidの画面上のシークバーを操作すると、PWMによる擬似的なアナログ出力でLEDの明るさを調整できる。
ブレッドボード上のCdSで明るさを計測して、Androidの画面上のシークバーの長さで表示したりした。
R0016190


動画




■準備
まず久しぶりに秋葉原に行ったら秋月が改装工事中だったので、他の店を見て回った。IOIOの開発者が使っているピンヘッダを千石で発見したので買った。

このピンヘッダ気に入った


このピンヘッダ、みっしりと敷き詰めるように装着できる。いつも使ってるメスピンヘッダは隣のピンにぶつかるので敷き詰められない。
ピンヘッダ装備IOIO

これでブレッドボードに線を引き出す準備が整いました


■回路を作る
ブレッドボードに5Vか3.3Vと、GNDを引き出す。
4番ピンでデジタル入力を試すために、タクトスイッチを通して5Vを流し込む。IOIO内部でGNDにプルダウンするので直結で良い。ただし、Read This Before Connectingに書いてある通り5Vを入れて良いピンは決まっているのでよくわからなかったらブレッドボードに出すのは3.3Vにしておいた方が良い。

3番ピンをLEDに接続する。PWMを試すため。

アナログ入力は40番ピン周辺に16個ある。45番ピンにCdSをつけ、10kΩで分圧した。

R0016189



■プログラムを書く
書いた。
AnalogInOutActivity.java

1からAndroidプロジェクトでIOIOを使う方法は前の記事を参考にされたし


このへんのドキュメント参考になる。



重要なのはAnalogInOutActivity.javaの49行目あたり
class IOIOThread extends AbstractIOIOActivity.IOIOThread{
private DigitalOutput led;
private DigitalInput btn;
private PwmOutput pwm;
private AnalogInput ain;
protected void setup() throws ConnectionLostException{
led = this.ioio_.openDigitalOutput(0, true);
btn = this.ioio_.openDigitalInput(4, Mode.PULL_DOWN);
pwm = this.ioio_.openPwmOutput(3, 1000); // 1000hz
ain = this.ioio_.openAnalogInput(45);
}

protected void loop() throws ConnectionLostException{
try{
led.write(!btnLed.isChecked());
if(btn.read()) seekBarDigitalIn.setProgress(1);
else seekBarDigitalIn.setProgress(0);
pwm.setDutyCycle((float)seekBarPwm.getProgress() / seekBarPwm.getMax());
seekBarAnalogIn.setProgress((int) (ain.read() * seekBarAnalogIn.getMax()));
sleep(10);
} catch (InterruptedException e) {
}
}
}

DigitalInputはMode.PULL_DOWNにしておく。PwmOutputは1kHzに設定した(最大10kHz)
PWMもAnlogInputも、0〜1の間のfloat値で入出力値を扱う。Androidの画面のSeekBarは最大値を1000にしておいたので、IOIO上での値を1000倍してintにcastすればSeekBarに表示できる。


デジタル入力の状態をAndroidの画面上に表示する時、IOIOThreadからUI Threadを操作するとデッドロックが起きてアプリが停止するが、なぜかSeekBarはデッドロックが起きないので長さ1の小さなSeekBarを作ってデジタル値を表現するように工夫した。

ほんとうは「android.os.Handlerクラスのpost()を使え」、とyoggyさんが言っていたので今度やってみます。

0

moxaでバイオメタルを動かした

バイオメタルをmoxaで動かすために0V~3V程度を出せる回路とプログラムを作った。

色々試した結果、最終的にPCからシリアル通信でmoxaのanalogWrite(PWM出力)を制御できるようにして、analogWriteをトランジスタ(2SC1815)に突っ込む。トランジスタは三端子レギュレータ7805から得た5Vを出すが、トランジスタを通る事で3.7V程度に落ちて、バイオメタルにちょうど良い電圧になった。

バイオメタルは「3Vで駆動」と書いてあったけど3.7Vでも大丈夫だった。5Vそのまま入れると変な臭いがしてきてヤバイ(すぐ止めました)

AVRマイコンのGPIO出力は3Vだけど40mAと電流が足りなかった。
バイオメタルを動かすには200mA程度必要で、秋月の3.3Vの三端子レギュレータを使っても動いたけどマイコンから制御するためにトランジスタをかますと2V程度に落ちてしまうので5V電源でやったらちょうど良くなった。アクチュエータ系は試行錯誤が必要だなー



パソコンでアナログ値を制御している動画


回路。基盤で隠れて見えないけど、moxaの左下のGNDはブレッドボードのGNDと接続されている
moxaでバイオメタル動かす
moxaでバイオメタル動かす


今回のtalkticコード
xtel technical information > learning> Analog Read & Writeを参考にした

serialInit(9600);
pinMode(1,true);
pinMode(0,true);
power = 0.0;

function onSerialReceive(){ // シリアル受信イベント
    while(serialAvailable()){ // 受信データがある時
        var recvData = serialRead(); // 読み出し
        power = recvData*0.01;
        analogWrite(0, power);
        analogWrite(1, power)
        serialSend(recvData); // 受信した文字列をそのままエコーする
    }
}

while(true){
}

1

PSoC DesignerでCY8C29466の16bitPWMを動かす

昨日は夕方にスタバに行って、PSoCいじってきました

真ん中のLEDがPWMで0.3秒間隔ぐらいで点滅する。PWM(Pulse Width Modulation)はON/OFFの振幅幅を指定して自動的に波形を作るしくみの事で、カウントアップするタイマカウンタに対してduty値を指定してそれより大きい時は出力をHI、小さければLOWにする。

つまり波形を操作するにはduty値、カウントアップの間隔(システムクロックを分周したりして調節できる)、カウントアップの初期値、最大値、1クロックあたりのカウントアップ値、などのレジスタ(たいてい普通の変数として代入できる)を設定しなおす事で動的に波形を変える事が出来る。

CY8C29466 PWM

PastelMagicの桑野さんが書かれた「はじめてのPSoCマイコン」の第1章 PSoCチュートリアル (p.25-53)を、PSoC MiniProgを買った時に付いてきたミニ評価ボード(CY3210-MiniEval1)にCY8C29466乗っけた版としてやってみた。

(この本ではCY8C27443を使っているが、ピンコンパチで上位版なので俺は29466をメインに使っていく予定)

はじめてのPSoCマイコン—周辺アナログ&ディジタル回路を自由自在にプログラミング!!
桑野 雅彦

CQ出版 (2004/11)

売り上げランキング: 137445
おすすめ度の平均: 4.0

5 PSoCをはじめる一冊

4 $10マイコンがバージョンアップ!

3 PSoCの基本が解ります

ちなみに29466はGainerでも使われている。

■用意するもの

・プログラムを書くIDE → PSoC Designer(Cypressダウンロードページ)

・ISPライター制御プログラム → PSoC Programmer(Cypressダウンロードページ)

・PSoC C言語コンパイラ → 秋月電子通販

・PSoC MiniProg → 秋月電子通販

・CY8C29466 → 秋月電子通販

Read more