2015年09月07日

ARM: Micro Python 発見編(1) 2015

Micro Python 発見編(1) 2015

* Micro Pythonとは
    その他動作可能なマイコン/ボード:
    * PyBoardの回路図等
    * Micro Pythonの言語仕様
    * 実行速度
    * オリジナル(PyBoard)のMCUはSTM32F405RG

* Micro Pythonに於けるSTM32F4-Discovery情報

* Micro PythonのPythonパーサ/字句解析についての記述
* Ethernet対応
* スケジューラの作成と実行
* マンデルブローとライフゲームのグラフィック・サンプルコード
* ガベージコレクションについてのヒント
* 消費電力についての記述

* STM32F4-Discoveryで実際に動かしてみた
    必要条件:
    注意ポイント:
    コンパイル時に必要なもの:
    コンパイル:
* 加速度センサ(STM32F4-Discovery)
    STM32F4-Discoveryで加速度センサを使う方法:
    バグ修正版 staccel.py:

* STM32F411-Discovery対応
* Nucleo-F401/F411RE対応
    Nucleo-F401で使う方法:
    Nucleo-F411で使ってみる:
    外部スクリプトをロードする方法:
    注意ポイント:

* dsPIC33FJ256GP506版
    コンパイル:
* その他,用意されているプロジェクト,フォルダ
    bare-metal:
    minimal:
    esp8266:

* 今後,参考になりそうな情報や参考ページ
    * LCDやHIDモードを使った例
    * モジュールの作り方


Micro Pythonというものを発見した。
詳細は調査中。

* Micro Pythonリンク集
Micro Python で組み込み Python by Hirotaka Kawata さん
http://sssslide.com/www.slideshare.net/hktechno/micro-python-python

Micro Python本家トップページ
    https://micropython.org/
Micro Python wiki
未読だけどかなり詳しい情報がありそう
http://wiki.micropython.org/Home
Github: Micro Python wiki
ここにも別なWikiがある。情報ありそう。
https://github.com/micropython/micropython/wiki
フォーラム
    http://forum.micropython.org/
ドキュメントや関数仕様等々
    http://docs.micropython.org/en/latest/
PyBoardをちゃちゃっと使ってみるサンプルコード
    http://docs.micropython.org/en/latest/pyboard/quickref.html
クイックスタート
    https://micropython.org/help/
ダウンロード:
    https://micropython.org/download/
Github:
    https://github.com/micropython/micropython

* Micro Pythonとは
(1) Python v3.4の言語仕様に基づき,マイコン上で仮想マシン・インタプリタ/コンパイラを実行する。
(2) STM32F405RGT6(168MHz動作)を使った専用ボード(PyBoard)が発売されている。
    https://micropython.org/store/#/store
    28ポンド
    1ポンド/180円(2015/09)なので5000円くらい。
その他動作可能なマイコン/ボード:
    今回はSTM32F4-Discoveryで動かしますが,
    STM32F746-Discovery, 
    STM32F411-Discovery,
    Nucleo-F401/F411,
    dsPIC33F, 
    NetDuino+2(STM32F405RG), 
    Teensy3.1,
    その他のマイコン,ボードで動く様です。
(3) ソースコードはMITライセンス。
    http://docs.micropython.org/en/latest/license.html
(4) ANSI Cで記述されている。
(5) インライン・アセンブラを装備。(ARMのみ)
(6) 高速実行。
(7) メモリ使用量と実行速度を考慮した3つの"コード生成/実行"。
    詳細は以下の原文とコメントのやりとりを参照。
    The 3 different code emitters 
    https://www.kickstarter.com/projects/214379695/micro-python-python-for-microcontrollers/posts/664832
    以下のコード生成(b),(c)を指示する場合,関数定義時にデコレータ指令を使う。
    通常は(a)を使い,少しスピードが欲しい時は(b)を使うといいだろう。
    (a) 通常の仮想マシンコード生成モード(Bytecode emitter)
        デフォルトでは仮想マシンコードが生成され,
        Micro Python内蔵の仮想マシンで実行される。(一部を除きCPythonと同等)
        メモリ(SRAM)使用量は一番小さい。
        デコレータ: @micropython.byte_code (デフォルトは無指定でこれになる)
    (b) Native emitterによるコード生成
        個々のバイトコードを等価なARM-Thumbコードに変換後実行する。
        ローカル変数はC言語のスタック領域に保存され,C言語レベルのランタイムルーチンを
        呼び出して実行する。
        メモリ使用量は中間程度。
        デコレータ: @micropython.native
    (c) Viper emitterによるコード生成
        Native emitterに整数演算の最適化を施したコードを生成する。
        例えば2つの整数の加算はC言語レベルのランタイムルーチンを呼ばず,
        直接ARM-Thumbコードの"adds命令"を生成する。
        状況に依っては,Native emitterより7倍程度高速実行可能な場合があるらしい。
        メモリ使用量は一番大きい。
        欠点: 全てのPython命令をサポートしている訳ではない。
        デコレータ: @micropython.viper
    boot.py内のオプションでデフォルトemitterを変更可能。

以下はViper emitterがデフォルトのBytecode emitterより24倍高速実行可能な例を
説明している。
The 3 different code emitters, part 2 
https://www.kickstarter.com/projects/214379695/micro-python-python-for-microcontrollers/posts/665145

(8) バイトコードはSRAM上に展開され実行される様だ。
(9) 基本ペリフェラル・ライブラリ
    GPIO, SPI, UART, I2C, Ethernet, Servo, PWM, Timer, ADC, DAC等々は
    標準で用意されている。
    SDカード, 加速度センサーも使える。

* PyBoardの回路図等
    http://micropython.org/resources/PYBv10b.pdf
    http://docs.micropython.org/en/latest/pyboard/hardware/index.html

* Micro Pythonの言語仕様
(1) Python v3.4 の仕様とほとんど同じである。
    ドキュメントは以下
    docs.python.org 
    より詳細な差異: Differences to CPython
(2) 違う部分の説明
    ARM Thumb2のサブセットを使ったインライン・アセンブラ仕様説明
    Inline Assembler for Thumb2 architectures
    http://docs.micropython.org/en/latest/reference/asm_thumb2_index.html    
(3) インラインアセンブラ関連情報
    Inline assembler 
    https://www.kickstarter.com/projects/214379695/micro-python-python-for-microcontrollers/posts/667580
    インラインアセンブラのチュートリアル
    http://docs.micropython.org/en/latest/pyboard/tutorial/assembler.html#pyboard-tutorial-assembler

* 実行速度
LEDチカチカの単純ループの比較であるけれど,
Arduino Uno 16MHzのC(++)言語で記述されたものと同等の速度が出る。
最適な書き方をすればMicro Pythonの方が2倍速いらしい。
    https://www.kickstarter.com/projects/214379695/micro-python-python-for-microcontrollers/posts/664832
Performance:
別な視点から比較ベンチマークを行っている
https://github.com/micropython/micropython/wiki/Performance

* オリジナル(PyBoard)のMCUはSTM32F405RG
F407(STM32F4-Discovery)との違いはF405側に「カメラIF」と「Ethernet IF」がないこと。
マニュアルが同じなので親和性が高い可能性があるが,
STM32F4-Discoveryボードは使用済みのI/Oが多いので,そのあたりが注意ポイントかも。
STM32F405RG
http://www.st.com/web/jp/jp/catalog/mmc/FM141/SC1169/SS1577/LN1035/PF252144

* Micro Pythonに於けるSTM32F4-Discovery情報
    Board STM32F407 Discovery
    https://github.com/micropython/micropython/wiki/Board-STM32F407-Discovery

* Micro PythonのPythonパーサ/字句解析についての記述
    Stretch goal ideas, and the parser 
    https://www.kickstarter.com/projects/214379695/micro-python-python-for-microcontrollers/posts/669549

* Ethernet対応
    Wiznet 5x00系対応
        Wiznet WIZ820io等に対応
    WiFiモジュール Adafruit CC3000に対応
    http://www.adafruit.com/products/1469
    日本で使えるかは不明
    https://www.kickstarter.com/projects/214379695/micro-python-python-for-microcontrollers/posts/681998

* スケジューラの作成と実行
    Progress, and some more example code
    https://www.kickstarter.com/projects/214379695/micro-python-python-for-microcontrollers/posts/675393

* マンデルブローとライフゲームのグラフィック・サンプルコード
    https://www.kickstarter.com/projects/214379695/micro-python-python-for-microcontrollers/posts/664040
    examplesフォルダにソースあり。

* ガベージコレクションについてのヒント
コメント欄参照
The C API in Micro Python 
https://www.kickstarter.com/projects/214379695/micro-python-python-for-microcontrollers/posts/679050

* 消費電力についての記述
Power consumption of the board 
https://www.kickstarter.com/projects/214379695/micro-python-python-for-microcontrollers/posts/685745

* STM32F4-Discoveryで実際に動かしてみた
必要条件:
    (1) MicroUSBケーブル: CN5に繋いでその先をPCに繋ぐ。
        Raspberry Pi用の物が使えた。 (^^)/
        CN5系由でUSB-Flash-MassStorage機能とUSB-UART(VCP)機能(REPL用)を使う。
    (2) デバッグ用のミニUSB端子 : ケーブルでPCに繋ぐ。
        (a) Micro Python的には単なる電源供給端子である。
        (b) ここにSTLink-UtilityのGUI版を繋いで「firmware.hex」を書き込めばMicro Pythonが動く。
            firmware.hexは自分でコンパイルしたものを使いました。
            コンパイル方法は下記,参考情報ページを参照。
注意ポイント:
    (1) インタラクティブシェル(REPL)用の仮想UART(COM)ポートが出現するので,
        Windows10ならTeraTerm等で115200bpsで接続,Enterキーでメッセージが出る。
        >>>help()
        と入力してみよう。
        Win8/7系は出現したドライブ中の「pybcdc.inf」をデバイスマネージャで
        不明になっているUSB(-COM)デバイスに対して「更新」でインストールする。
        Win10も後からinfファイルをインストールした。識別が容易になるので。
    (2) インタラクティブシェルにコードをコピペする時の注意
            これハマリました。 orz
            TeraTerm上へPyhtonコードをコピペする時は,
            <CR>付きコピペを使うこと。
            CRなしコピペだとうまくコードが認識されず文法エラーが起きたりします。
            orz
    (3) Flashドライブは必ず「取り出し」する
        マスストレージでマウントされた「main.py」が存在するドライブ(Flashドライブ)の取り扱いはSDカード等と同じく,
        ボードリセットやボードの電源を切る前に,必ずエクスプローラから「取り出し」を実行しておきます。
        取り出し完了までに結構時間がかかります。(Windows10)
        これを忘れてFlashファイルシステムが破壊されると以後編集不能になりファーム書き換えでも復活しません。
        orz
    (4) 破壊されたFlashドライブを初期化する
        上記で編集やコピーが不能になった場合,STLink-Utilityから
        「Target」-「Erase Chip」を実行後,ファームを書き込みなおします。
        これで全て初期化された状態で復帰します。
    (5) 「取り出し」なしで編集,実行を繰り返す方法
        main.pyを編集した後,REPLターミナルから「CTRL-D」を押すとMicro Pythonのソフトリセットがかかり,
        Flashドライブとターミナルの接続状態を保持したまま「main.py等」が再読込みされます。
        通常はこの方法で使うのが良いと思います。
        但し,今ひとつ挙動が微妙なところがあるので,結局ハードリセット使ったりします。orz
コンパイル時に必要なもの:
    (1) arm-none-eabi-gcc.exeにパスを通す。
    (2) Python v3.4.x(2.7.x)にもパスを通す。
        https://www.python.org/downloads/
        Pythonはv3.4系を推奨します。一部のツール(tools/pyboard.py)がv2.7系未対応だったりします。
    (3) make.exe も必要。
コンパイル:
stmhalフォルダで,
make BOARD=STM32F4DISC
...
CC usbdev/class/src/usbd_msc_scsi.c
CC usbdev/class/src/usbd_msc_data.c
CC build-STM32F4DISC/pins_STM32F4DISC.c
LINK build-STM32F4DISC/firmware.elf
   text    data     bss     dec     hex filename
 267528      96   27676  295300   48184 build-STM32F4DISC/firmware.elf
Create build-STM32F4DISC/firmware.dfu
Create build-STM32F4DISC/firmware.hex
build-STM32F4DISCフォルダ内の「firmware.hex」をSTLink-Utilityで書き込みます。 * 加速度センサ(STM32F4-Discovery) STM32F4-Discoveryの加速度センサライブラリはバグで動かない様です。orz PyBoardとは関数の呼び出し方が違います。 STM32F4-Discoveryで加速度センサを使う方法: (1) stmhal/boards/STM32F4DISC/staccel.pyをFlashドライブにコピーします。 (2) REPLターミナルから
>>> import staccel
>>> ac = staccel.STAccel()
でオブジェクト化します。 後は, ac.x() ac.y() ac.z() ac.tilt() ac.filtered_xyz() 等の関数が使えるはずですが, 初期化時のバグで加速度センサのIDが正しく取得できず,上記のオブジェクト化で失敗します。 orz 以下その話題。 STM32F4-Discoveryのバグ http://forum.micropython.org/viewtopic.php?f=2&t=595&start=10 現時点で上記「やっつけバグ修正」をしても初期化で失敗します。 orz バグ修正版 staccel.py: STM32F4-Discoveryボード上の加速度センサは2種類あって, 古いボードはLIS320DL 新しいボードはLIS3DSHが載っているようです。 自分のは古い方のICでした。 IC判別は自動で行われるので気にする必要はありませんが,ボードをよく見ると上記文字の一部が 読み取れます。 動作可能な様に修正したものをここに置いておきます。 micropython-fixed-staccel-py-201509-v2.zip : DMA禁止版 準備中 micropython-fixed-staccel-py-201509.zip : 古い版 本家にプルリクエストしておいたので将来反映されるかもしれません。 古いICでしか動作確認していません。 注意ポイント: 初回の加速度センサID取得が失敗するので2度読みするという,やっつけで 動作可能にしていますが根本原因は分かっていないようです。 上記自分の修正版は,それに加えてSPIクロックの極性(Porarity)を1(=CPOL)に変更してあります。 基にしたと思われるSTMicroのサンプルコードはCPOL=0となっていてバグっている様です。 あと,SPIクロックが約330KHz(328125Hz)と低速だったので2MHzに修正しておきました。 328125Hzに何か意味があるのか今のところ不明です。 追記: 「プルリクエストにコメントくれた人がいて,実は最初動いていたけどSPIをDMA化した時に おかしくなったことが判っていて,read_bytes()関数内を割り込み禁止にすればIDを2度読み する必要はない。割り込みを禁止するとDMAは自動で禁止されるから。 でも,どうしてそうしないといけないのかは判っていない」と言われた。 DMA禁止版をプルリクエストしておいた。 * STM32F411-Discovery対応 Audio DACやセンサ山盛り。STM32F4-Discovery(STM32F407)のMCUをF411VEに変えた様なボード。 http://www.st.com/web/en/catalog/tools/FM116/SC959/SS1532/LN1848/PF260946?s_searchtype=keyword 数日前にコミットされたばかり。 stmhalフォルダで,
make BOARD=STM32F411DISC
* Nucleo-F401/F411RE対応 以下のページでNucleo-F401で使う方法が解説されている。 Running micropyton on STM32Nucleo-F4 http://www.carminenoviello.com/en/2015/06/03/running-micropyton-stm32nucleo-f4/ 現在のところ,本家とは別リポジトリなので注意。 https://github.com/cnoviello/micropython Nucleo-F401で使う方法: 上記リポジトリを取得して stmhalフォルダで,
make BOARD=STM32F4NUCLEO
Nucleo-F411で使ってみる: F401は持っていないのでF411で動かしてみた。 上記F401はデフォルトでコンパイル可能だがF411はソースの修正が必要。 追記 2016/02 : ソース無修正でF401のバイナリをF411に書き込んだほうが良いと思います。 STM32F4NUCLEOフォルダ内の (1) mpconfigboard.h 内の定義を以下に修正
#define MICROPY_HW_MCU_NAME         "STM32F411xE"
(2) mpconfigboard.mk 内の定義を以下に修正
CMSIS_MCU = STM32F411xE
AF_FILE = boards/stm32f411_af.csv
LD_FILE = boards/stm32f411.ld
システムクロック周りやリンカスクリプトはよく見る必要があるかもしれないが, 今回はそのままで実験してみた。
make BOARD=STM32F4NUCLEO
で「build-STM32F4NUCLEO」に生成された「firmware.hex」をSTLink-Utilityで 書き込みます。 仮想COMポートが出現するので、115200bpsで接続してEnterキーを押せば、 インタラクティブシェルが起動します。 外部スクリプトをロードする方法: Windows上のやり方です。 toolsフォルダにあるpyboard.pyを使います。 PC側のPythonはバージョン3.x系である必要があります。 (1) $ python pyboard.py --device=COM4 foo.py これで任意のfoo.pyスクリプトをロード/実行できます。 (COMポート番号はデバイスマネージャから見つけてください) (実際にはpyboard.pyの前にtoolsフォルダまで,foo.pyの前にそこまでの 相対フォルダ又は絶対フォルダが必要です)(必要ならですが) 上記コマンド実行後,自動でソフトリセットがかかるので,foo.pyに実行可能命令が有る場合 自動実行されます。 関数・クラス定義だけならREPLコンソールから呼び出しできます。 注意ポイント: この方法は電源OFFでfoo.pyが消えてしまいます。 Flashに書き込むには次の方法を使います。 (2) $ python pyboard.py --device=COM4 --send foo.py これでFlashにfoo.pyが書き込まれ実行されるはずですがF411の場合, 今のところうまく動きません。 orz * dsPIC33FJ256GP506版 PICの16bitマイコンでも動く様だ。 ただし,現時点ではコンパイル可能なスタートポイントという感じで,必要最小限なLEDチカチカ, UART,ベタ待ちdelay,Switch程度しかインプリメントされていないので, ペリフェラル操作関数は自分で作り込む必要がある。 dsPIC33Fで動くならPIC24F系で動かすことも可能だろう。 コンパイル: pic16bitフォルダで,
make XC16=/c/xc16/v1.23
でコンパイル可能。 XC16はコンパイラへのパス。 「unistd.h」が存在しないエラーが出たら「../py/stream.c」内の「#include <unistd.h>」をコメントし, 代わりに「#include <stdio.h>」を追加する。 コンパイラはv1.23, v1.11でOK。 v1.25はリンクエラーとなった。 orz
...
CC main.c
CC board.c
CC pic16bit_mphal.c
CC modpyb.c
CC modpybswitch.c
CC modpybled.c
CC ../stmhal/pybstdio.c
CC ../stmhal/pyexec.c
CC ../lib/mp-readline/readline.c
LINK build/firmware.elf
   text    data     bss     dec     hex filename
 180248     488    9692  190428   2e7dc build/firmware.elf
Create build/firmware.hex
ペリフェラルIFがほとんどない状態でFlash 180kbyteなので 256Kbyte以上のマイコンが必要そう。 * その他,用意されているプロジェクト,フォルダ bare-metal: STM32F405RGT6 ARM用の仮想マシンのみをコンパイルする最小プロジェクトと思われる。 コンパイル結果は以下,
LINK build/firmware.elf
   text    data     bss     dec     hex filename
  71488       0     404   71892   118d4 build/firmware.elf
minimal: 上記bare-metalよりも現実的なプロジェクト。STM32版はUART経由で使える風。 (1)PC用: minimalフォルダ内でmakeと打つとPC用のバイナリを生成します。 このバイナリでそのままPC上(MS-DOS窓/xterm等)でREPLが動きます。
LINK build/firmware.elf
    text       data        bss        dec        hex    filename
  141528        296       2524     144348      233dc    build/firmware.elf
Windows上だと"alloca.h"がないと言ってコンパイルできない。 Linux上なら問題ない。orz (2)STM32F4xx用: minimalフォルダ内で make clean make CROSS=1 と打てばSTM32Fxx用(デフォルトはSTM32F405)のバイナリができます。 UART1経由でREPLができます。9600bps 。
CC main.c
CC uart_core.c
CC uart_extra.c
CC ../lib/utils/printf.c
CC ../lib/utils/pyexec.c
CC ../lib/libc/string0.c
CC ../lib/mp-readline/readline.c
LINK build/firmware.elf
   text    data     bss     dec     hex filename
  77812       4    2524   80340   139d4 build/firmware.elf
Create build/firmware.dfu
esp8266: WiFiモジュール esp8266内蔵マイコン上でMicro Pythonを動かすプロジェクト。 コンパイラである xtensa-lx106-elf-gcc.exeはArduino1.6.5 IDE用のものが使用できる。 コンパイラへのパスはMsys/MinGWの場合,以下の様に設定する。(Windows10)
export PATH=/c/Users/user_name/AppData/Local/Arduino15/packages/esp8266/tools/xtensa-lx106-elf-gcc/1.20.0-26-gb404fb9/bin:$PATH
現時点ではコンパイルエラーとなる。orz * 今後,参考になりそうな情報や参考ページ * LCDやHIDモードを使った例 planset blogさんのブログ Micro Python http://dkpyn.com/blog/2375 STM32F4-Discovery * モジュールの作り方 MicroPython で遊ぶ(2014/9) http://moxi.jp/wiki/wiki.cgi?page=MicroPython+%A4%C7%CD%B7%A4%D6%282014%2F9%29 MicroPython Pyboard を使ってカラーディスプレイ(μOled128)を動かす http://takesan.hatenablog.com/entry/2015/08/12/204937
posted by Copyright (C) avrin All Rights Reserved. at 00:00| Comment(1) | Python | このブログの読者になる | 更新情報をチェックする

2014年06月15日

python-on-a-chip(p14p)((pymite))のオンライン・コンパイラ (^^)/

2014: Vim超入門者が最初にすべき10の設定 メモ
va009039さんがすばらしいものを作ってくれました。
マイコンのプログラムがPythonコードで書けちゃいます。

va009039さんの日記 
Nucleo F401REでpython-on-a-chipを動かす
http://va009039.blogspot.jp/2014/06/nucleo-f401repython-on-chip.html
オンラインコンパイラ
https://bitbucket.org/va009039/pymbed
見つけたばかりなんだけど、
コンパイルが一瞬で終わって、目が点になっちゃいました。
なんかすばらしい印象です。

* オンライン・コンパイラ・メモ
(1)プログラムの一番最後に、改行のみの行が必要です。
(2) Python特有の行頭のインデントはTAB文字かスペースで、
    混在しててもいいような感じです。(詳細未確認)



* python-on-a-chipの名称についてのメモ
正式名称のフル版: python-on-a-chip
正式名称の省略版: p14p  (上記 「p」と「p」の間に14文字あるから)
昔の名前: pymite

* その他のメモ
Pythonじゃないんだけど、mruby。
mrubyもこういうオンライン・コンパイラあると気軽に試せて
おもしろいと思う。
一気に注目浴びちゃうね。

* p14p開発状況のメモ
正式ページ
https://code.google.com/p/python-on-a-chip/
更新が2011年で停止している様に見えますが、
v09系はGPLライセンスに移行し、開発は事実上停止しています。
(一部メンテナンスはごく希に行われる)
現在は「v10系」に移行し、上のページではよく分らない感じですが、
Mercurialのリポジトリベースで最新版を取得可能です。
難しいポイント:
p14pはPython2.6にしか対応していなくて、特にLinuxの場合、
現在Python2.7ベースのシステムが多いこともあり、Python2.6の導入が難しい状況です。
従って、そこが参入障壁になり微妙にユーザが増えない原因の一つと思います。
オンライン・コンパイラならそういう点が気にならないのが大きなメリットだと思います。





参考:
PyMite: Pythonでマイコン制御(2)マイコン編
http://avr.paslog.jp/article/1585446
PyMite: Pythonでマイコン制御(1) 導入編
http://avr.paslog.jp/article/1547733.html


posted by Copyright (C) avrin All Rights Reserved. at 00:00| Comment(1) | TrackBack(0) | Python | このブログの読者になる | 更新情報をチェックする

2011年09月24日

MapleでPymite

リーフラボの中の人がMaple nativeという、
日本で言うと、「まるっきりSTBeeっぽい」Mapleを使って(爆
Pymiteを動かした様子。
http://leaflabs.com/2011/09/pymite/
ソースコード
https://github.com/leaflabs/projects
posted by Copyright (C) avrin All Rights Reserved. at 14:47| Comment(0) | Python | このブログの読者になる | 更新情報をチェックする

2010年11月06日

PythonでTextLCDクラス hidmon.dll(2)

PythonでTextLCDクラス hidmon.dll(2)

前回のPython用に作ったデジタルI/Oクラスを実際に
キャラクタLCDの制御に使ってみました。

LCDの端子が6本必要でHIDaspx(wSNak #214)では半田付けなしで
取り出せる端子が1本足りないのでHIDaspx(wSNak #216)に変更
しました。

Python言語を使って「mbedのTextLCDクラス」、
「arduinoのLiquidCrystalクラス」のように
1行でLCDの初期化設定が終了します。
「mbedのTextLCDクラス」に近い感じで使えます。
http://mbed.org/cookbook/Text-LCD

python-textlcd-fig.gif
 python-rss-feed-1.jpg
 python-rss-feed-2.jpg
上の写真はRSSデータを表示しているところです。
RSSはBBCのワールドニュースヘッドラインを順番に表示しています。
実際は1行目が左にスクロールして表示されていきます。
2行目は日付と時計です。

LCDなので残像が目立ちますが十分使える範囲です。
LCD(SD1602VBWB)が青に白抜きなので「電飾効果」も結構ありますね。
思わずBBCのニュースに見入ってしまいます。

RSSデータの解析はURLを指定すればPythonのライブラリを使って
これも1行で取得と解析が終了します。
このあたりが豊富なライブラリがあるパソコン上から
直接制御できるメリットです。

ちなみにHIDaspx/hidmon.dllの仕様上、デジタルI/Oクラスの最小パルス幅は
約1msecになります。

# Initialize USB I/O
io.init("*")

# Define LCD object
#                   rs/cd,   e  ,  d4 ,   d5 ,   d6 ,  d7  
lcd = tlcd.TextLcd( 'PB2', 'PB3', 'PB4','PB5', 'PB6', 'PB7' )

i = 0
while True:
    lcd.locate( 0, 0 )
    lcd.printf( 'Hello world!%d', i)
    lcd.locate( 0, 1 )
    lcd.printf( getDateTime() )
    time.sleep( 1 )
    i += 1

io.exit()
mbedやArduinoがプロトタイプ様式とすればPythonを使った今回のものは プロトタイプのさらに前段に位置します。 mbedやArduinoは簡単といっても「C++/C言語」なので 便利なライブラリ部分以外は一定の知識が必要です。 さらに開発環境も必要です。 一方、Python等のパソコン上のスクリプト言語はBASIC言語と同様 「型宣言」が必要ないので非常に気軽にトライできます。 コンパイルやFlash ROMに書き込む作業も不要です。 mbedやArdiunoはprintfを使ってデバッグしますが、 Pythonには「PyScripter」という「ステップ実行や変数参照」が出来る無料の デバッグツールもあります。 PyScripter - 軽快動作のWindows向けPython開発環境 http://journal.mycom.co.jp/column/ide/057/index.html pyscripter オリジナルページ http://code.google.com/p/pyscripter/ 以下のようにTextLcdクラスは内部でデジタルI/Oクラスを使用していますので 各クラスの動作確認も出来ました。
class TextLcd( strm.Stream ):
    def __init__( self, rs, en, d4, d5, d6, d7, rw='NC' ):
        strm.Stream.__init__( self )
        self.rs  = dio.DigitalOut ( rs )  # cd/rs/a0
        self.en  = dio.DigitalOut ( en )
        self.bus = dio.BusInOut ( d7, d6, d5, d4 ) 
以下の回路で+5VはHIDaspx基板から取っています。 textLcd-schema.gif コントラスト調整の抵抗(R2)はSimさんのページを参考にして http://blog.goo.ne.jp/sim00/e/6c9741c0fa944565b4c4d7dc96f740fe 2KΩ1個で決めています。 lcd-jp.jpg 上のようにTextLCDクラスはデフォルトで日本語の曜日データを CGRAMに書込み済みです。テーブルデータを変えるだけで いろんなキャラクタが簡単に表示出来ます。
posted by Copyright (C) avrin All Rights Reserved. at 17:55| Comment(0) | Python | このブログの読者になる | 更新情報をチェックする

2010年10月16日

PythonでデジタルI/Oクラス hidmon.dll(1)

PythonでデジタルI/Oクラス hidmon.dll(1)
*概要 :デジタルI/Oクラス
*Pythonでhidmon.dllを使う
*Pythonのclass文
*Pythonで作ったデジタルI/Oクラス
  DigitalOutクラス
  BusOutクラス
  PortOutクラス
*Pythonのインストール
  *デジタルI/Oクラスのダウンロード
  *使い方




*概要 :デジタルI/Oクラス
今回は「Python言語を使ったデジタルI/Oクラス」について探検してみます。
最近プチブーム中のPython言語の探索も兼ねています。
「デジタルI/Oクラス」はこれも最近プチプチブーム中の「mbed」の
クラスを真似てみることにします。

というのも、mbedの「デジタルI/Oクラス」は分かり易くて良くできていると
思います。以前も書きましたが特に「ビットオブジェクト」という考え方が
直感的ですばらしく分かり易いと思います。

mbedのDigitalOutクラス
http://mbed.org/handbook/DigitalOut

例えば「LEDチカチカ」はmbedのDigitalOutクラスを使って以下のように書けます。
#include "mbed.h"

DigitalOut myled( LED1 );

int main() {
    while(1) {
        myled = 1;
        wait(0.25);
        myled = 0;
        wait(0.25);
    }
}
「LED1」というのは実際にはポート1の19番目の端子(P1.18/P1_18)と 同じです。 「myledというビットオブジェクト」を定義すれば myled = 1 でLED点灯 myled = 0 でLED消灯 と非常にスッキリ記述出来てしまいます。 「シンプルでクール」ですね。 *Pythonでhidmon.dllを使う では実際にhidmon.dllを使ってI/Oポート制御してみたいと思います。 hidmon.dllはirukaさんが開発されたI/O制御用dllです。 senshuさんのページも参考になります。 以前ほかの言語でhidmon.dllを使ったことがありましたが今回は「Python言語」です。
# by audin 2010/10 

from ctypes import *
import time

lib = windll.LoadLibrary("hidmon.dll")

def pset( port_name, data ):
    addrs = lib.PortAddress( port_name )
    lib.UsbPoke( addrs , 0, data, data )

def pclr( port_name, data ):
    addrs = lib.PortAddress( port_name )
    lib.UsbPoke( addrs , 0, ~data, data )

PB2 = (1<<2)
PB3 = (1<<3)

########################
#  main
########################
lib.UsbInit("*")

pattern = ( PB2 | PB3 )
pset( "DDRB", pattern  )
while True:
    pset( "PORTB", pattern )
    time.sleep( 0.5 )
    pclr( "PORTB", pattern )    
    time.sleep( 0.5 )

lib.UsbExit()
Pythonで上のように書いてみました。 DLL呼び出しの初期化は「3行目、6行目」のみで非常に簡単です。 ハードウエアはHIDaspxでPB2とPB3端子に付いているLEDが点滅します。 (32行目は呼ばれないけどおまけ) メイン処理は20行目から。 Python言語も簡単で良いね! *Pythonのclass文 上のやり方もシンプルで十分良いけど今回はmbedの「デジタルI/Oクラス」を 真似て導入してみるのが目的。 「シンプルでクール」なmbedの以下の記述を実現するには、
DigitalOut myled( LED1 ); /* ビットオブジェクトを定義 */
myled = 1;                /* LED点灯                  */
クラス化した時に「代入演算子"="のオーバーロード」という機能が必要になります。 残念ながらPython(2.6系)にこの機能はありません。 仕方がないので「property」という機能を使います。 するとPythonでは以下のように書けます。
myled     = io.DigitalOut( LED1 )    # ビットオブジェクトを定義
myled.bit = 1                        # LED点灯
2行目のように「bitプロパティ」に代入します。 mbedのようには書けませんがこれでも「それなりにクール」だと思います。(-: *Pythonで作ったデジタルI/Oクラス mbedの「Digital I/O」を真似て以下のクラスを作りました。(仕様は簡略化してあります) http://mbed.org/handbook/Homepage DigitalOut, DigitalIn, DigitalInOut BusOut, BusIn, BusInOut PortOut, PortIn, PortInOut DigitalOutクラス:
#
# Test for hidmon.dll digital I/O class.
#

# DigitalOut class test

import time
import Digital_Io as io

# Initialize USB I/O
io.init("*")

# Define bit object
led1 = io.DigitalOut("PB2") 
led2 = io.DigitalOut("PB3") 

DELAY_SEC = 0.5

# LED blink
led2.bit = 1                # led2 off

for i in range( 10 ):
    led1.bit = 0
    time.sleep( DELAY_SEC ) 
    led1.bit = 1
    time.sleep( DELAY_SEC )  

led2.bit = 0                 # led2 on

io.exit()                    # final proc
上がPythonで作った「DigitalOut クラス」の使用例です。 「14行目、15行目」でAVR Tiny2313の「PB2,PB3」ビットを指定して 「ビットオブジェクト」を作っています。 あとは「bitプロパティ」にゼロか1を代入するだけで「ビット操作」出来ます。 BusOutクラス: BusOutクラスは非常に強力であちこちに余っているビットを束ねて、 好きな順序に並べた上でバスのように扱うことができます。 余ったポートビットを集めて「ナイトラダー」や「キャラクタLCD制御」が 簡単にできてしまうスグレモノです。
#
# Test for hidmon.dll digital I/O class.
#

# BusOut class test

import time
import Digital_Io as io

# Initialize USB I/O
io.init("*")

DELAY_SEC = 0.5

# Define BusOut object
bus = io.BusOut( io.pb2, io.pb3 )
while True:
    for i in range(4):
        bus.data  = ~i
        time.sleep( DELAY_SEC )
        print bus.data
io.exit()
上がBusOutクラスの使用例です。 「io.pb2」は「"PB2"」と同じ意味です。 PortOutクラス: PortOutクラスはポート単位でビット操作します。 BusOutの様に柔軟性はないですが、その分高速に動作するのが特長です。 ただし今回の場合、効果は薄いと思われます。
#
# Test for hidmon.dll digital I/O class.
#

# PortOut class test

import time
import Digital_Io as io

# Initialize USB I/O
io.init("*")

# define bit mask
LED_MASK = ( (1<<3) | (1<<2) )

# Define port object
port = io.PortOut( "PORTB", LED_MASK ) 

DELAY_SEC = 0.5

while True:
    port.data = LED_MASK
    time.sleep( DELAY_SEC ) 
    port.data = 0
    time.sleep( DELAY_SEC )  

io.exit()                    # final proc
上の例も「PB2,PB3」のLEDが点滅します。 *Pythonのインストール Python2.6系なら大丈夫と思います。(Windows用です) Pythonは以下から ActivePython http://www.activestate.com/activepython/downloads ActivePython-2.6.6.15-win32-x86.msi をダウンロードしてインストールします。PATH設定も自動なのでお勧めです。 (日本語のサイトのものはPATH設定されないので注意が必要です。) ただし、スクリプト内に日本語のコメントがあると実行できないようです。 (未解決) *デジタルI/Oクラスのダウンロード python-digital-io-class-hidmon-2010.zip(準備中) から取得します。 *使い方 上記ファイルを解凍したフォルダの「Digital_Io.py」がデジタルI/Oクラスです。 他のファイルはサンプルスクリプトです。 例えばコマンドラインで
> python digiOut.py
を実行すれば動作します。 ハードウエアのHIDaspxは「hidmonモード」で起動しておいてください。 *ジャンパー設定 #214 基板 (AVRライタ) hidaspx-214pwb-switch.jpg JP3をショートして「hidmon」モードで起動させる。 参考: スコープと名前空間 http://morchin.sakura.ne.jp/effective_python/scope.html 3. 形式ばらない Python の紹介 http://www.python.jp/doc/2.5/tut/node5.html#SECTION005110000000000000000 5.1 リスト型についてもう少し http://www.python.jp/doc/2.5/tut/node7.html 9. クラス http://www.python.jp/doc/2.5/tut/node11.html クラス変数?インスタンス変数? http://d.hatena.ne.jp/Ponsuke/20090128/1233115400 第 5 回 オブジェクト指向の基礎知識 http://www.geocities.jp/m_hiroi/light/python05.html Lua関連 LuaからC言語を呼び出す tolua++の使い方 dllの作り方 http://d.hatena.ne.jp/kitfactory/20100511/1273583585 高速スクリプト言語「Lua」を始めよう!(4) http://www.hakkaku.net/articles/20081118-286 LuaでOOP http://akazero.hp.infoseek.co.jp/OOP.html Lua 5.1 リファレンスマニュアル http://sugarpot.sakura.ne.jp/yuno/html/lua51_manual_ja.html#pdf-setmetatable C++プログラマがLuaを勉強してみる第10回 http://snowycode.blogspot.com/2010/07/clua10.html クラス(もどき) † http://www.tom.sfc.keio.ac.jp/~fjedi/wiki/index.php?Lua#g70938c6 Lua で組んでみる http://www.antun.net/tips/script/lua.html ビット演算 [Lua]ビット演算 http://d.hatena.ne.jp/eggman/20070920/1190238162 Object Oriented Programming http://lua-users.org/wiki/ObjectOrientedProgramming Multiple Inheritance Classes http://lua-users.org/wiki/MultipleInheritanceClasses /lua/5.1/docs/classlib/classlib.html
posted by Copyright (C) avrin All Rights Reserved. at 22:59| Comment(0) | Python | このブログの読者になる | 更新情報をチェックする