自分のブログなので,自分のまとめとしておく。
PIC, AT, STMといったいわゆる小型のマイコンを,趣味,興味から使い始めてみて2ヶ月ほど。その間に,ありがたいことで,職場でも使わせていただく機会があり,いろいろ勉強になった数ヶ月だった。
なんだかんだと,PICを一番使っている。特に,内蔵モジュールのPWMとコンパレータを使った案件は楽しかった! まさにPICを使いこなしている,という雰囲気だ。
ただ,XC8/XC16と,MPLAB IDEには手を焼く。
まず,XC8は整数の扱いが他のコンパイラーと少し違う? 計算が正しいか,入念なチェックが必要。
XC16+MCCは無愛想で,生成されたサンプルがさっぱり理解できない...
とか,細かいところはやはり不満。
そして,ICSPによるプログラム書き込みはいいけど,そのままそれをシリアルモニターできないのはツラい。別途シリアル回線を準備するか,OLED等で状況表示,スイッチ等で動作変更が必要となる。
使う用途は限定されるが,MPLAB IDEのsimulationは,それなりに使える。上記,「コンパイラーは正しく計算しているか?」の検証は,ある程度できる。
STM32 Nucleo + mbed では,上記のようなPICの不満は解消される。
ハードウエア設定はほぼ皆無でよく,サンプルを見てソースコードを埋め込めば,割とあっさりと動くようになる。USBで接続したまま,mbedのweb上のコンパイラーからダウンロードされた .bin を,ターゲットにコピーするようにすれば,即,実行される。さらにUSBを接続したままで,パソコン上でシリアルターミナルソフトで状況確認が容易である。
惜しいのは,大掛かりなmbedの影響か,CPUの能力を100%引き出せてはいないのではないか,ということ。STM32であれば,ST純正の開発環境を使えば少しは違うのかと思うが,まだ試せていない。
職場でも使ってみた。いい感じではあったが,残念ながら,私の接続ミスでターゲットを壊してしまった。反省...
古いSTM32も,mbedで.binをつくり,STLINKでターゲットに書いて実行させることはできるようになった。ただしこちらも壊してしまい,深くは検証できていない。また反省...
アトメルのCPU + Arduinoの環境,小規模な制御は,上記の流れから「かなりいい線」ではないかと思っている。シリアルを接続したまま,書き込みと,そのままArduino IDEのシリアルモニターが使える。Arduino言語はそれなりによくできていて,参考になるコードもいっぱい。コーディングはしやすい。
惜しいのは,クラウドベースの開発環境が無いこと。mbedの「場所を問わずに開発」はよくできている。
それはともかく,もう少し使ってみよう,ということで,職場でも使えそうなこれを発注してみた。
https://www.dfrobot.com/product-1075.html
職場では,ブレッドボードは使わない。実験基板に,あるいは直接はんだ付けしてテストする。小規模な方が,組み込むにせよ,外でテストするにしても,有利である。
USBからプログラム,シリアルモニターが使えそうなので,開発や,状況確認も簡単そうだ。
さて,届くまで楽しみに,別のボードで遊んでいよう。
土曜日, 12月 07, 2019
火曜日, 11月 19, 2019
ニッケル水素電池 放電器 つづき
正直,ここまで手こずるとは...
お仕事で,もう少し高い電圧の電池の放電器を作ったことがあって,それはほぼ想定通りの動きをしていた。それは,
こんな感じの,パワートランジスタのコレクタ接地回路=定電流回路だった。
今回は,ニッケル水素電池1本ということもあり,電圧が低い分,たやすくできるだろうと考えていた。甘かった...
ブレッドボード上で組み,micro:bitと組み合わせてテストをしたところ,目論見では200mAぐらい余裕で流せるはずなのに, 50mAぐらいまでしか出ない。
電池1本に対しては,Vbeが大きく,電池1本程度の電荷ではどうにもうまくトランジスタをONできないようだ...
もはや micro:bit はあまり関係なくて,simulatorで仮設計した回路をブレッドボードで試す。あ,この時,micro:bit と OLED で,簡易電圧表示器を作って,複数チャンネル同時にADしながら,動作確認をしてみた。ああ,すごく便利。
その結果,以下の回路で,やっと想定通り動くようになった。
最終的にはV1はPWMから作るつもりだったけど,テストではDC3.3V直結。micro:bitは,実質3.1Vぐらいになるようで,そうすると,設計値180mAぐらい放電できる。試してみたら,本当に180mAぐらいだった。やっと動き始めた!!
エミッタ接地の強烈な増幅で,やっと小さいエネルギーのニッケル水素電池1本の電流を引き出せるようになってきた。
* 1.434 / 1.120 とかは,テスターの実測値をみながら,補正係数としたもの。
お仕事で,もう少し高い電圧の電池の放電器を作ったことがあって,それはほぼ想定通りの動きをしていた。それは,
こんな感じの,パワートランジスタのコレクタ接地回路=定電流回路だった。
今回は,ニッケル水素電池1本ということもあり,電圧が低い分,たやすくできるだろうと考えていた。甘かった...
ブレッドボード上で組み,micro:bitと組み合わせてテストをしたところ,目論見では200mAぐらい余裕で流せるはずなのに, 50mAぐらいまでしか出ない。
電池1本に対しては,Vbeが大きく,電池1本程度の電荷ではどうにもうまくトランジスタをONできないようだ...
もはや micro:bit はあまり関係なくて,simulatorで仮設計した回路をブレッドボードで試す。あ,この時,micro:bit と OLED で,簡易電圧表示器を作って,複数チャンネル同時にADしながら,動作確認をしてみた。ああ,すごく便利。
その結果,以下の回路で,やっと想定通り動くようになった。
最終的にはV1はPWMから作るつもりだったけど,テストではDC3.3V直結。micro:bitは,実質3.1Vぐらいになるようで,そうすると,設計値180mAぐらい放電できる。試してみたら,本当に180mAぐらいだった。やっと動き始めた!!
エミッタ接地の強烈な増幅で,やっと小さいエネルギーのニッケル水素電池1本の電流を引き出せるようになってきた。
OLED.writeString("P0:")
OLED.writeNum(Math.round(pins.analogReadPin(AnalogPin.P0) * 3300 / 1023 * 1.434 / 1.120))
OLED.writeString("mV ")
OLED.writeString("P1:")
OLED.writeNum(Math.round(pins.analogReadPin(AnalogPin.P1) * 3300 / 1023 * 1.434 / 1.120))
OLED.writeStringNewLine("mV ")
OLED.writeString("(P0-P1)/2.2:")
OLED.writeNum(Math.round((pins.analogReadPin(AnalogPin.P0) - pins.analogReadPin(AnalogPin.P1)) * 2700 * 120 / 128 / 1023 / 2.2))
OLED.writeStringNewLine("mA ")
ちなみにOLEDには,こんな感じでP0とP1の電圧と,その間にある2.2オームの電流値を表示しまっくてみた。
火曜日, 11月 12, 2019
働くPIC
そうそう,こういうの,やりたかったんだ。
micro:bitから基準電圧を出すために,PWMの波形を確認。
というコードで,1/100usec = 10kHzの矩形波をP1から出力している。これをPIC24Fの簡易オシロで確認した。
これなら,1k+10uFで,十分簡易DCにできそうだ。
micro:bitから基準電圧を出すために,PWMの波形を確認。
pins.analogSetPeriod(AnalogPin.P1, 100)これなら,1k+10uFで,十分簡易DCにできそうだ。
月曜日, 10月 21, 2019
micro:bit 想定 ニッケル水素電池チェッカーを作ろう! 準備編
(追記)
前の投稿の通り,micro:bit の「アナログ出力」とはPWMのことで,以下回路は修正が必要。気が向いたら直します...
(追記終わり)
家にたくさんあるニッケル水素電池を活用したい。でも,結構古いものもあるので,選別,リフレッシュも兼ねて,容量の確認,つまり放電を行う小物を作ってみようと思い立った。
マイコンを使って,電圧を読みながら放電電流を調整すれば,過放電も防げる。
ついでに充電も考えてみた。
部品をそろえるまで,テストプログラムを作ってみた。放電専用
[A] を押すと,目標放電電流を10mAあげる。
[B] を押すと,10mA下げる。
充電で,micro:bit から取り出す場合,100mAが限度なんで注意。まずはその制限はなし。
デバッグ用に,USBに現在の値をかき出すようにしてみた。
input.onButtonPressed(Button.B, function () {
if (Target_mA < 200) {
Target_mA = Target_mA + 10
}
})
input.onButtonPressed(Button.A, function () {
if (Target_mA > 0) {
Target_mA = Target_mA - 10
}
})
serial.onDataReceived(serial.delimiters(Delimiters.Hash), function () {
})
let P2_VCONT = 0
let P1_VDET = 0
let P0_VBAT = 0
let Target_mA = 0
let step_time = 1000
let next_time = step_time + input.runningTime()
serial.redirect(
SerialPin.USB_TX,
SerialPin.USB_RX,
BaudRate.BaudRate9600
)
pins.analogWritePin(AnalogPin.P2, 0)
basic.forever(function () {
P0_VBAT = pins.analogReadPin(AnalogPin.P0)
P1_VDET = pins.analogReadPin(AnalogPin.P1)
if (input.runningTime() > next_time) {
next_time = next_time + step_time
serial.writeLine("P0_VBAT: " + convertToText(P0_VBAT) + " means " + P0_VBAT / 1023 * 3.3 + "V")
serial.writeLine("P1_VDET: " + convertToText(P1_VDET) + " means " + P1_VDET / 1023 * 3.3 / 3 * 1000 + "mA")
serial.writeLine("P2_VCONT: " + convertToText(P2_VCONT))
serial.writeLine("Target_mA: " + convertToText(Target_mA))
serial.writeLine("----")
basic.clearScreen()
for (let i = 4 - Math.round(P0_VBAT / 1023 * 4); i <= 4; i++) {
led.plot(0, i)
led.plot(1, i)
}
basic.pause(100)
for (let i = 4 - Math.round(Target_mA / 200 * 4); i <= 4; i++) {
led.plot(3, i)
basic.pause(100)
}
}
if (Target_mA > P1_VDET / 1023 * 3.3 / 3 * 1000) {
if (P2_VCONT < 1023) {
P2_VCONT += 1
pins.analogWritePin(AnalogPin.P2, P2_VCONT)
}
}
if (Target_mA < P1_VDET / 1023 * 3.3 / 3 * 1000) {
if (P2_VCONT > 0) {
P2_VCONT += 0 - 1
pins.analogWritePin(AnalogPin.P2, P2_VCONT)
}
}
})
前の投稿の通り,micro:bit の「アナログ出力」とはPWMのことで,以下回路は修正が必要。気が向いたら直します...
(追記終わり)
家にたくさんあるニッケル水素電池を活用したい。でも,結構古いものもあるので,選別,リフレッシュも兼ねて,容量の確認,つまり放電を行う小物を作ってみようと思い立った。
マイコンを使って,電圧を読みながら放電電流を調整すれば,過放電も防げる。
ついでに充電も考えてみた。
部品をそろえるまで,テストプログラムを作ってみた。放電専用
[A] を押すと,目標放電電流を10mAあげる。
[B] を押すと,10mA下げる。
充電で,micro:bit から取り出す場合,100mAが限度なんで注意。まずはその制限はなし。
デバッグ用に,USBに現在の値をかき出すようにしてみた。
input.onButtonPressed(Button.B, function () {
if (Target_mA < 200) {
Target_mA = Target_mA + 10
}
})
input.onButtonPressed(Button.A, function () {
if (Target_mA > 0) {
Target_mA = Target_mA - 10
}
})
serial.onDataReceived(serial.delimiters(Delimiters.Hash), function () {
})
let P2_VCONT = 0
let P1_VDET = 0
let P0_VBAT = 0
let Target_mA = 0
let step_time = 1000
let next_time = step_time + input.runningTime()
serial.redirect(
SerialPin.USB_TX,
SerialPin.USB_RX,
BaudRate.BaudRate9600
)
pins.analogWritePin(AnalogPin.P2, 0)
basic.forever(function () {
P0_VBAT = pins.analogReadPin(AnalogPin.P0)
P1_VDET = pins.analogReadPin(AnalogPin.P1)
if (input.runningTime() > next_time) {
next_time = next_time + step_time
serial.writeLine("P0_VBAT: " + convertToText(P0_VBAT) + " means " + P0_VBAT / 1023 * 3.3 + "V")
serial.writeLine("P1_VDET: " + convertToText(P1_VDET) + " means " + P1_VDET / 1023 * 3.3 / 3 * 1000 + "mA")
serial.writeLine("P2_VCONT: " + convertToText(P2_VCONT))
serial.writeLine("Target_mA: " + convertToText(Target_mA))
serial.writeLine("----")
basic.clearScreen()
for (let i = 4 - Math.round(P0_VBAT / 1023 * 4); i <= 4; i++) {
led.plot(0, i)
led.plot(1, i)
}
basic.pause(100)
for (let i = 4 - Math.round(Target_mA / 200 * 4); i <= 4; i++) {
led.plot(3, i)
basic.pause(100)
}
}
if (Target_mA > P1_VDET / 1023 * 3.3 / 3 * 1000) {
if (P2_VCONT < 1023) {
P2_VCONT += 1
pins.analogWritePin(AnalogPin.P2, P2_VCONT)
}
}
if (Target_mA < P1_VDET / 1023 * 3.3 / 3 * 1000) {
if (P2_VCONT > 0) {
P2_VCONT += 0 - 1
pins.analogWritePin(AnalogPin.P2, P2_VCONT)
}
}
})
日曜日, 10月 20, 2019
前の投稿ですでに写真をのせてあるのですが,micro:bitのAN0/1/2以外の端子を使おうとすると,変換ボードがあったほうがいい。
すごくいろいろ種類があるのですが,これを選んでみた。
理由としては,小物を配線しようとするときに,まとまりがいいかなあと。
DCジャックがあり,3.3Vに変換し,micro:bitに電源供給できるっぽい。 回路図で確認したいところだが,見当たらない...(出品者に問い合わせ中)
とりあえずDCジャックは使わないで使えるのか? amazonの製品ページでは,それができている写真があるが...
無事使えているようだ。
実装されているレギュレータが,逆耐圧防止のダイオードが入っているのかも。
すごくいろいろ種類があるのですが,これを選んでみた。
DCジャックがあり,3.3Vに変換し,micro:bitに電源供給できるっぽい。 回路図で確認したいところだが,見当たらない...(出品者に問い合わせ中)
とりあえずDCジャックは使わないで使えるのか? amazonの製品ページでは,それができている写真があるが...
無事使えているようだ。
実装されているレギュレータが,逆耐圧防止のダイオードが入っているのかも。
金曜日, 10月 18, 2019
秋月 FT234X 超小型USBシリアル変換モジュール テスト
micro:bit - FT234Xモジュール - MacBook Pro
結線は以下の通り
- micro:bit P0(送信に設定)-モジュールのRX
- micro:bit P1(受信に設定)-モジュールのTX
Mac側は,https://www.ftdichip.com/Drivers/VCP.htmからドライバーをインストール。
通信ソフトは,簡単なCoolTermを使用。
実験結果,良好。プログラム通り,Mac側から [#] をタイプすると,micro:bitが反応を返してくる。
実はこの結線では,micro:bitの正規の電源コネクター等には電源が接続されていない。Mac - VBUS - FT234XのTX で,TXのプルアップを介してmicro:bitに給電していることになる。それでもやすやすと動いている。最近のマイコンは省電力で,すごい!
念のため,電池でもテスト。もちろん問題なし。
#使い古したニッケル水素電池なので,6本使っています
登録:
投稿 (Atom)








