micropythonでLチカ

まずはLチカから

ESP8266にmicropythonが入ったので、それを使ってLEDを光らせてみた。 14番pinとGNDの間にLEDを繋ぐと、薄っすらと光ったが、おそらくpull upされているのだろう。

import machine
pin=machine.Pin(14, machine.Pin.OUT)

としてから、pin(1)とpin(0)でON/OFFができる。pythonからLEDを制御できたことで、少し喜んでいたら、他の人にはUSB接続をしたままLEDのON/OFFできても当たり前だ、と言われてしまった。折角esp8266を使っているのだから、wifiからON/OFFさせろという意味なのだろう。

Read more...

ESP8266にmicropythonを入れて動かしてみた.

無事に動いた

インストール作業には古いubuntuのPCを使ったが,まず準備としてこのPCにesptoolをインストールする.

sudo aptitude install python-pip
sudo pip install esptool

そして,esp8266用のmicropythonのbinaryをdownloadしてから,ESP8266をUSBで接続して,これを書き込む.

sudo esptool.py --port /dev/ttyUSB0 erase_flash
sudo esptool.py --port /dev/ttyUSB0 --baud 460800 write_flash --flash_size=32m 0 esp8266-20180511-v1.9.4.bin

これで準備が整ったので,実行してみるが,シリアル接続するためにscreenをインストールして,次のように実行する.

sudo screen /dev/ttyUSB0 115200

そこで,esp8266のボードをリセットすると,ターミナルにpythonのプロンプトが表示される.ここにscriptを打ち込むと,その結果が返ってくる.試しに足し算などをしてみたが,足し算ができただけで一人で喜んでいた.

試しにプログラムを実行してみるには,ターミナルで打ち込んで挙動を見るのは有用であるが,実際に使う時には不便である.micropythonは,起動時にboot.pyが,次いでmain.pyが実行される.これらのファイルを転送すれば,自動的に実行される.そこで,ファイルの転送ツールをインストールする.

sudo pip install adafruit-ampy

ampyを使うと,ftpのような感じのコマンドで,ファイルの転送ができ,それを実行することができた.

ampy --port=/dev/ttyUSB0 ls
ampy --port=/dev/ttyUSB0 put main.py
ampy --port=/dev/ttyUSB0 rm main.py

実行したい命令をmain.pyに入れて,それを転送すれば,リセット後に実行することができる.

Read more...

様々なマイコン

esp8266でmicropython
いろいろなマイコンをいじってみたくて、今年はstm32を少し触り始めたところです。最近は、ESP32というのも流行っているようなので、調べてみると、以前使ったESP8266の上位のマイコンであることが分かった。さらに、micropythonやmrubyというpythonやrubyも動かせるらしい。しかし、stm32やesp8266もろくに使いこなせていないのに、esp32に手を出すのは早い気がする。 esp8266でもmicropythonを使えるようになってきているようなので、まずはそれを試してみる方が良いだろうという考えに至った。ここからfirmwareを落として、書き込んだら、シリアルからpythonのプログラムを動かせるようになるらしい。でも、時間が無いのでまだ試していない。

Read more...

Gimpを使って

背景を透明に
texに図を貼り付けている時に、図が重なって、下になった図の一部が見えなくなってしまうことがあった。図の形式はpngであったが、その図の背景は透明では無く、白色になっていた。背景を透明にすれば、図が重なっても大丈夫なのでは無いかと思い、やってみた。 元のpngファイルとGimpで開いて、「レイヤー-透明部分-アルファチャンネルの追加」としてから、「ツール-選択ツール-色域を選択」とし、白い部分をクリックしてdelキーを押すと、白い背景が透明になる。最後に「ファイル-エクスポート」でpngでセーブすれば、背景を透明化したファイルができる。 これをtexに取り込んでみると、図が重なっても問題無く表示できるようになった。

Read more...

povrayでネジを描画

関数の等値面を使って 以前povrayでネジを書こうと思って、うまく行かずに挫折したことがある。いろいろと調べてみたら、ようやく書き方が分かったので、メモをしておくことにする。ポイントは、等値面を描くisosurfaceと、螺旋を作る関数f_helix1を使うことである。M3のネジを書くソースは以下のような感じになった。 #include "colors.inc" #include "shapes.inc" #include "textures.inc" #include "functions.inc" #declare Screw= isosurface { function{ f_helix1(x,y,z, 1, // number of helixes, (1 = single helix, 2 = double helix etc.) 2*2*pi, // For number N of turns per heigth of y = 1 unit, use N*2*pi 0.62, // minor radius, 0.62, // major radius, 1, // shape parameter, 0.0, // cross section type, (0.0 to 1.0 = square .
Read more...

arduinoでモーター制御

ステッピングモーターの信号
PCから信号を送ってステッピングモーターを回したくなるときが時々ある。最初にやったときには、何の信号を使おうか迷って、結局RS232Cの信号を使って、文字の情報をパルスにみたてて送ることで、これを実現した。幼稚な考えだが、それなりにうまく行った。面倒だったのは、RS232Cの信号の電圧をMAX232でTTLレベルに変換することぐらいかな。 マイコンを使うようになってからは、いろいろな方法をやったけど、PCとマイコンをどのように通信するかが結局課題になった。RS232Cと通信したり、GPIBをエミュレートしたり。 で気がついたのだが、arduinoを使えば、PCとはUSBで通信できて、終わりでは無いかと。arduinoを使うほどでは無いとも言えるが、まあ中華のだと安いし、はんだ付けはほぼ不要だし、これで良いかなと思う。

Read more...

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を詳細に設定するプログラムも作れるようだが、単に使うだけなら、これで良いだろう。

Read more...

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が使えるようになった.

Read more...

温度モニター

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もうまく読める.

Read more...