contents
    1. 2009年1月24日(土) K*BUG 勉強会
  1. これまでのあらすじ(?)
  2. Gainer / Arduino / DWM2008-05基板とは?
    1. 利用形態
    2. Hardware
    3. Software
    4. Links
    5. 書籍
  3. ドライバーとFreeBSDとわたし
    1. Gainer / ArduinoはuftdiでUSB接続
    2. DWM2008-05基板
    3. シリアルでのテスト動作 (デモ): Gainerはテキストベースのコマンドで通信
    4. Tips: USB Serialのパーミッション調整
  4. ProcessingとFreeBSDとわたし
    1. 自家製Gainer用ports
  5. RubyとFreeBSDとわたし
    1. デモ: GainerをRubyで使ってみる
    2. History
  6. Squeak+GainerとFreeBSDとわたし
    1. ttyU*を使う
    2. cuaU*を使う
    3. Squeakイメージ側の修正
    4. デモ: DWM2008-05基板とSqueak+GainerでDrive a Car
    5. 問題点
  7. Arduino開発環境とFreeBSDとわたし
    1. portsで必要なもの
    2. patched avrdudeのbuild
    3. History
  8. まだまだ残る疑問点
  9. 今後の野望
  10. おまけ: PicoBoard + Scratch + FreeBSD Squeak VM (デモ)
  11. 補足 by 光永さん

Serial知りはる?知ってはる?

2009年1月24日(土) K*BUG 勉強会

kbug-serial-half.png

武藤武士 <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
  • 2008年09月06日(土): K*BUG勉強会@大阪
  • 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基板

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の汎用シリアル(など)ライブラリ
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とわたし

  • なんか、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

Squeak+GainerとFreeBSDとわたし

  • 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からに変更
GNSerialClient_fix.png

デモ: DWM2008-05基板とSqueak+GainerでDrive a Car

DWM2008-05.png

問題点

  • データ落ちする
    • 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

まだまだ残る疑問点

  • Squeakどう直すベ?
  • 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 (デモ)

補足 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スクリプトで動作することを確認した
Last modified: 2009-03-13
Post-it: New Post-it (help)

Text color: [_][_][_][_]

Background: [_][_][_][_][_][_]

Draw Line:

x: y: