contents
- 2009年1月24日(土) K*BUG 第1回研究会
- これまでのあらすじ(?)
- Gainer / Arduino / DWM2008-05基板とは?
- 利用形態
- Hardware
- Software
- Links
- 書籍
- ドライバーとFreeBSDとわたし
- Gainer / ArduinoはuftdiでUSB接続
- DWM2008-05基板
- シリアルでのテスト動作 (デモ): Gainerはテキストベースのコマンドで通信
- Tips: USB Serialのパーミッション調整
- ProcessingとFreeBSDとわたし
- 自家製Gainer用ports
- RubyとFreeBSDとわたし
- デモ: GainerをRubyで使ってみる
- History
- Squeak+GainerとFreeBSDとわたし
- ttyU*を使う
- cuaU*を使う
- Squeakイメージ側の修正
- デモ: DWM2008-05基板とSqueak+GainerでDrive a Car
- 問題点
- Arduino開発環境とFreeBSDとわたし
- portsで必要なもの
- patched avrdudeのbuild
- History
- まだまだ残る疑問点
- 今後の野望
- おまけ: PicoBoard + Scratch + FreeBSD Squeak VM (デモ)
- 補足 by 光永さん
Serial知りはる?知ってはる?
2009年1月24日(土) K*BUG 第1回研究会
武藤武士 <mutoh@openedu.org>
これまでのあらすじ(?)
- 2002年3月頃: AVRで遊ぼう@FreeBSD Press No9っつうのも…
- 2008年4月: Design Wave Magazine 2008/05を購入
- かえるジャンプが動かせないorz
- そもそも付録基板付きの本が大好き
- 2008年7月: OSC2008 Kansai@Kyoto
- Make:な人にBrain Hack Machineをもらう
- 2008年8月: OSC2008 Nagoya
- NBUGの隣の展示がGainerだった
- Gainerの中の人の講演を聞く
- 2008年09月06日(土): K*BUG勉強会@大阪
- テンション高いままスイッチサイエンスでGainerとArduinoをポチッ
- 2008年11月: KOF2008: 今日の発表の内容を展示
- イベント当日、既に真っ白な灰になってた…
- Gainerの中の人の隣の人に精進が足らんと指摘されるorz
- 2009年01月: C5で、勝手にデモ
- まさか、こんな所でpepperに会えるとは…
- 英語の壁に敗北orz
Gainer / Arduino / DWM2008-05基板とは?
- 左: Gainer(sparkfun版)
- 右上: Arduino Diecimila
- 右下: Design Wave Magazine 2008/05付録基板
- Keywords: Physical Computing, Open Hardware, Sketch
- ハードウエアのプロトタイピング(スケッチ)を簡単にするための環境
- DWM2008-05基板: Gainerのサブセットを実装
利用形態
- Gainer/DWM2008-05基板: 別のコンピュータ(BSD;-)で制御
- Arduino: ファームを作成して、スタンドアローンで動作
- これ の p14(Arduino) vs p16(Gainer)
Hardware
- CPU
- Gainer: PSoC (AVR, PICでの互換実装あり)
- Arduino: AVR
- DWM2008-05基板: Cortex-M3(=ARM)
- USB接続
- Gainer/ArduinoはFT232RL(uftdi)
- DWM2008-5基板はCDC-ACM(umodem)
- Others: DWM2008-05基板は、3軸加速度センサーあり
Software
- Gainer/ArduinoはProcessingベースの環境あり
- Gainerはその他にも、各種実装(Ruby, Pythoon, Squeak, ...)あり
Links
書籍
ドライバーとFreeBSDとわたし
Gainer / ArduinoはuftdiでUSB接続
$ sudo kldload uftdi.ko
- こんな感じ。
ucom0: <FTDI FT232R USB UART, class 0/0, rev 2.00/6.00, addr 4> on uhub1
DWM2008-05基板
- umodemにpatchが必要(6.4Rの場合): 多分、危険
- 正しい対処は、send-pr:usb/91546やsend-pr:usb/117185?
- [補足] NetBSDでumodemの実装が変わった頃とsend-pr
- [補足2009/03/13] 7.1Rでは、以下のパッチ相当を当てても動かない
- [補足2009/03/13] USB4BSD入りの8-currentでは、パッチ無くても大丈夫(USB4BSD素敵)
fuji [ sys/dev/usb ] % diff -u umodem.c.20080925 /usr/src/sys/dev/usb/umodem.c --- umodem.c.20080925 2008-09-25 18:47:21.000000000 +0900 +++ /usr/src/sys/dev/usb/umodem.c 2008-11-09 17:38:01.000000000 +0900 @@ -262,11 +262,13 @@ if (ret == UMATCH_NONE) return (ret); +/* umodem_get_caps(uaa->device, &cm, &acm); if (!(cm & USB_CDC_CM_DOES_CM) || !(cm & USB_CDC_CM_OVER_DATA) || !(acm & USB_CDC_ACM_HAS_LINE)) return (UMATCH_NONE); +*/ return ret; }
- で、読み込む
$ sudo kldload umodem.ko
- こんな感じ。
ucom1: <STMicroelectronics STM32 Virtual COM Port, class 2/0, rev 2.00/1.00, addr 5> on uhub1 ucom1: iclass 2/2 ucom1: data interface 1, has no CM over data, has no break ucom1: status change notification available
シリアルでのテスト動作 (デモ): Gainerはテキストベースのコマンドで通信
vaio [ ~ ] % sudo cu -l /dev/cuaU0 -s 38400 Connected in > ?* # firmwareのバージョン確認 out> ?1.0.0.15* in/out> Q* # rebootする in/out> KONFIGURATION_1* # 設定1で動作させる in/out> h* # onboard LEDを点灯 in/out> l* # onboard LEDを消灯 in/out> Daaaa* # Digital出力にaaaaを出力 in > I* # アナログ入力からデータを取る out> IE4FDFFFF* in > I* # アナログ入力からデータを取る(again) out> I57636B6D* in > i* # 連続入力モードでアナログ入力 out> iE4B6BDC8*iE3BCB8BC*iE4F6FFFF*iE3D6EBFB*iE3B1B3B9*iE3E3E2D9*iE3F4FFFF*(snip) in/out> E* # 連続入力モード終了
Tips: USB Serialのパーミッション調整
- /dev/cuaU*を使う場合は、dialerグループに入っておいた方が楽
- permissionは、以下のような設定で、変更可能
vaio [ /etc ] % diff -u devd.conf.20090114 /etc/devd.conf --- devd.conf.20090114 2009-01-14 18:55:17.000000000 +0900 +++ /etc/devd.conf 2009-01-14 18:55:09.000000000 +0900 @@ -325,3 +325,9 @@ action "/etc/acpi_ac $notify"; }; */ + +attach 10 { + device-name "ucom0"; + action "chmod 666 /dev/ttyU0*"; + action "chmod 666 /dev/cuaU0*"; +};
- [C] /etc/devfs.confでの設定も可能 by takawataさん
ProcessingとFreeBSDとわたし
- http://processing.org/
- Processing = Java + IDE + Visualization ?
- Javaベースで、イベントドリブンなプログラムや可視化が楽
- Windows, Mac, Linux用がある
- graphics/processing: Linux用をインストールする
- Serialの操作にcomms/rxtxを利用(send-pr:127600)
- comms/rxtx : Javaの汎用シリアル(など)ライブラリ
- /dev/{tty,cua}U*を使えるようにしてもらう(send-pr:127555)
diff -ruN rxtx.org/files/patch-RXTXCommDriver.java rxtx/files/patch-RXTXCommDriver.java --- rxtx.org/files/patch-RXTXCommDriver.java 1970-01-01 09:00:00.000000000 +0900 +++ rxtx/files/patch-RXTXCommDriver.java 2008-09-22 20:23:05.000000000 +0900 @@ -0,0 +1,10 @@ +--- src/RXTXCommDriver.java.org 2008-09-22 20:39:29.000000000 +0900 ++++ src/RXTXCommDriver.java 2008-09-22 20:40:08.000000000 +0900 +@@ -591,6 +591,7 @@ + "ttyd", //general purpose serial ports + "cuaa", //dialout serial ports + "ttyA", //Specialix SI/XIO dialin ports ++ "ttyU", //USB serial ports + "cuaA", //Specialix SI/XIO dialout ports + "ttyD", //Digiboard - 16 dialin ports + "cuaD", //Digiboard - 16 dialout ports
- Gainer用のライブラリは、Processingに追加でインストールする必要がある
自家製Gainer用ports
- 更にGainer用のライブラリが必要:独自port
- Known Problem:keywords.txtを復旧しない
RubyとFreeBSDとわたし
- http://8-p.info/gainer-ruby/
- 今ならFUNNEL使ったほうが嬉しいらしい
- なんか、ruby-termiosでうまく動かなかったので、serialportを使うように変えた
--- gainer-0.0.2.org/lib/gainer.rb 2008-02-03 18:08:45.000000000 +0900 +++ gainer-0.0.2/lib/gainer-serial.rb 2008-12-20 07:30:36.000000000 +0900 @@ -1,5 +1,7 @@ require 'gainer/port' +require 'serialport' + module Gainer class Basic AIN, DIN, AOUT, DOUT = 0, 1, 2, 3 @@ -126,11 +128,9 @@ end end - require 'termios' class Serial < Basic def initialize(path, config = nil) - @file = File.open(path, 'w+') - @file.sync = true + @file = SerialPort.new(path, 38400) setup_port super(config) @@ -139,10 +139,7 @@ private def setup_port - setting = Termios::getattr(@file) - setting.ispeed = setting.ospeed = 38400 - setting.cflag |= Termios::CS8 - Termios::setattr(@file, Termios::TCSANOW, setting) + @file.baud=38400 end def command_send(c) @@ -181,7 +178,7 @@ g = Gainer::Serial.new(ARGV.shift) done = false - g.on_press = proc do + g.on_pressed = proc do done = true end
デモ: GainerをRubyで使ってみる
- 外が暗くなると画面も暗くなって、嫌になっちゃう;-p
led=0 until done g.led = ! g.led g.digital_output=led button=g.peek_digital_input cds=g.peek_analog_input br=sprintf("%x",255-g.analog_input[0]) system "xsetroot -solid \##{br}#{br}#{br}" print 'press button to quit. led = ', (g.led ? 'on ' : 'off'), ":#{led},Input: #{button},#{cds}.\n" sleep(0.2) led=(led+1)%16 end g.led = false g.digital_output=0
History
- KOF2008準備の一日 serialport使うように変更
Squeak+GainerとFreeBSDとわたし
- Squeak+Gainerで、Gainerを利用可能
- squeak-ja:2008-September/003989 GainerとSerialとわたし
- UNIX用VMは、ttyS*以外を使うこと考えてないし
ttyU*を使う
vaio [ squeak/work/Squeak-3.9-7 ] % diff -u platforms/unix/plugins/SerialPlugin/sqUnixSerial.c.20081018 platforms/unix/plugins/SerialPlugin/sqUnixSerial.c --- platforms/unix/plugins/SerialPlugin/sqUnixSerial.c.20081018 2008-10-18 20:46:44.000000000 +0900 +++ platforms/unix/plugins/SerialPlugin/sqUnixSerial.c 2008-10-18 21:58:43.000000000 +0900 @@ -23,7 +23,7 @@ /* portNum 0=/dev/ttyS0, etc. */ /* include 1 byte for NUL at end */ #define PORT_NAME_SIZE 11 -static const char serialPortBaseName[] = "/dev/ttyS0"; +static const char serialPortBaseName[] = "/dev/ttyU0"; /* stopBits 0=1.5, 1=1, 2=2 */ /* I don't know how to get 1.5 stop bits. Oh well. So you get 2 instead */ @@ -335,7 +335,7 @@ /* tcflag_t c_oflag output modes */ /* defaultTermios.c_oflag = 0; */ /* tcflag_t c_cflag control modes */ - defaultTermios.c_cflag = CREAD; + defaultTermios.c_cflag = (CREAD|CLOCAL); /* tcflag_t c_lflag local modes */ /* defaultTermios.c_lflag = 0; */ /* cc_t c_cc[NCCS] control chars */
cuaU*を使う
fuji [ unix/plugins/SerialPlugin ] % diff -u sqUnixSerial.c.20081018 /usr/ports/lang/squeak/work/Squeak-3.9-7/platforms/unix/plugins/SerialPlugin/sqUnixSerial.c --- sqUnixSerial.c.20081018 2008-10-18 17:58:25.000000000 +0900 +++ /usr/ports/lang/squeak/work/Squeak-3.9-7/platforms/unix/plugins/SerialPlugin/sqUnixSerial.c 2008-10-19 15:59:43.000000000 +0900 @@ -23,7 +23,7 @@ /* portNum 0=/dev/ttyS0, etc. */ /* include 1 byte for NUL at end */ #define PORT_NAME_SIZE 11 -static const char serialPortBaseName[] = "/dev/ttyS0"; +static const char serialPortBaseName[] = "/dev/cuaU0"; /* stopBits 0=1.5, 1=1, 2=2 */ /* I don't know how to get 1.5 stop bits. Oh well. So you get 2 instead */
Squeakイメージ側の修正
- GNSerialClient class >> findClient
- シリアルポート3から舐めてるので0からに変更
デモ: DWM2008-05基板とSqueak+GainerでDrive a Car
問題点
- データ落ちする
- Windowsでもなるらしい
vaio [ ~ ] % dmesg (snip) ucom0: lost 10 chars ucom0: lost 10 chars ucom0: lost 10 chars ucom0: lost 10 chars
Arduino開発環境とFreeBSDとわたし
- ベースはProcessing
- AVRの操作のために、独自パッチのavrdudeを使っている
portsで必要なもの
- firmwareのコンパイルのために、以下のportsが必要
- JRE (diablo-jdk-1.6.0.07.02)
- devel/avr-gcc
- devel/avr-libc
- うちでは、buildに以下の修正が必要だった
fuji [ /etc ] % diff -u make.conf.20081010 /etc/make.conf --- make.conf.20081010 2008-10-10 09:29:19.000000000 +0900 +++ /etc/make.conf 2008-10-10 10:09:17.000000000 +0900 @@ -7,3 +7,6 @@ PERL_VER=5.8.8 PERL_VERSION=5.8.8 OVERRIDE_LINUX_BASE_PORT=f8 +# for avr-libc / doxygen +WITHOUT_LATEX=true +NOPORTDOCS=true
- 環境の準備
vaio [ ~/work/arduino ] % tar zxvf arduino-0012-linux.tgz (snip) vaio [ ~/work/arduino ] % cd arduino-0012/hardware/tools vaio [ arduino-0012/hardware/tools ] % mkdir avr vaio [ arduino-0012/hardware/tools ] % ln -s /usr/local/bin avr/bin vaio [ arduino-0012/hardware/tools ] % cd ../..
patched avrdudeのbuild
fuji [ work/arduino/avrdude-5.4-arduino-src ] % CFLAGS=-I/usr/local/include LDFLAGS=-L/usr/local/lib ./configure (snip) fuji [ work/arduino/avrdude-5.4-arduino-src ] % make (snip)
History
- Arduino環境構築 展開とports側を利用するように調整
- Arudino動いた avrdude構築
まだまだ残る疑問点
- Squeakどう直すベ?
- ttyUとcuaUの違いって?
- [A] 端末とモデムの違いらしい by 皆さま
- やっぱり、rxtxみたいにしないとダメ?
- Serial Plugin doesn't handle arbitary nodes namesという修正は入ったが…
- Gainer/Arduinoのports
- バックアップしておいたファイルを戻すのは?
- avrdudeはどうしよう?
- Gainer Serial Proxy
- これ動かせば、Squeakとかも素のままでOk?
- みんなDebugどうしてる?
- USB_DEBUGとか、uftdidebugとか、umodemdebugとか
- ktraceとか、kdumpとか
- Dtrace???
今後の野望
- DWM2008/05基板
- Firmware書き換えて、LEDやSD、外部端子とかも使えるようにしたいなぁ
- FUNNEL
- もう少し上のレベルを含んだライブラリ
- 基板もGainerやArduino、Funnel I/Oなどたくさん対応
- 物欲
- PicoBoard for Scratch (2008/12/17ポチッ)
- LilyPadだと娘たち(小四,5歳)と一緒に…、手芸?
おまけ: PicoBoard + Scratch + FreeBSD Squeak VM (デモ)
- Scratch.image + Squeak VM 3.9-7 for FreeBSDで動作
- 日本語にすると豆腐になる
- PicoBoard: スライダ + 光センサ + 音センサ + ボタン + 電圧入力 x 4
- 技術情報: Scratch Board Technical Information
- スクラッチ アイデアブック - ゼロから学ぶスクラッチプログラミング
補足 by 光永さん
- http://www.eleki-jack.com/Kurobox-pro2/2009/01/usb-io-gainer-mini.html
- Gainer miniのモードについて
- Matrix LEDモード
- ラジコンサーボモード
- ラジコンサーボ1つぐらいはUSBからの電力供給でも大丈夫
- Gainer用Cライブラリも提供
- Artistだけに使わせるのはもったいない
- ラジコンサーボの動作デモあり
- 光永さんにGainer miniを借りて、FreeBSDに突っ込む
ucom0: <RTcorporation GAINERmini v1.1, class 2/0, rev 2.00/0.00, addr 2> on uhub1 ucom0: iclass 2/2 ucom0: data interface 1, has no CM over data, has no break ucom0: status change notification available ucom0: at uhub1 port 1 (addr 2) disconnected ucom0: detached
- で、cuとデモ用rubyスクリプトで動作することを確認した