フォト
2017年4月
            1
2 3 4 5 6 7 8
9 10 11 12 13 14 15
16 17 18 19 20 21 22
23 24 25 26 27 28 29
30            
無料ブログはココログ

« 2014年12月 | トップページ | 2015年2月 »

2015年1月の15件の記事

2015年1月31日 (土)

Linuxで直接シリアルデバイスを利用する際の注意点等

Linuxにて、直接 /dev/ttyUSB0、/dev/ttyACM0 なんかのデバイスを使って
arduinoやichigoJamなんかとちょっとした通信を行う場合のメモです。
まあ、自分がハマって苦労した点です。

具体的には、
#  cat /dev/ttyUSB0
#  echo "ABCDE" > /dev/ttyUSB0

とかやって、データをやり取りする場合に発生する問題点に対応する方法のメモです。

現在の通信速度や通信条件の確認

# stty -a < /dev/ttyUSB0 speed 115200 baud; rows 0; columns 0; line = 0; intr = ^C; quit = ^\; erase = ^?; kill = ^U; eof = ^D; eol = <undef>; eol2 = <undef>; swtch = <undef>; start = ^Q; stop = ^S; susp = ^Z; rprnt = ^R; werase = ^W; lnext = ^V; flush = ^O; min = 1; time = 0; -parenb -parodd cs8 -hupcl -cstopb cread clocal -crtscts -cdtrdsr -ignbrk -brkint -ignpar -parmrk -inpck -istrip -inlcr -igncr icrnl ixon -ixoff -iuclc -ixany -imaxbel -iutf8 -opost -olcuc -ocrnl -onlcr -onocr -onlret -ofill -ofdel nl0 cr0 tab0 bs0 vt0 ff0 -isig -icanon -iexten -echo -echoe -echok -echonl -noflsh -xcase -tostop -echoprt -echoctl -echoke

または、

# stty -g < /dev/ttyUSB0
500:0:18b2:0:3:1c:7f:15:4:0:1:0:11:13:1a:0:12:f:17:16:0:0:0:0:0:0:0:0:0:0:0:0:0:0:0:0

通信条件の設定

arduinoやichigoJamなんかと、通信したい場合の設定

#stty -F /dev/ttyUSB0 115200 \
-iuclc -ixany -imaxbel -iutf8 -opost -olcuc -ocrnl -onlcr \
-onocr -onlret -ofill -ofdel nl0 cr0 tab0 bs0 vt0 ff0 -isig \
-icanon -iexten -echo -echoe -echok -echonl -noflsh -xcase \
-tostop -echoprt -echoctl -echoke

空白文字(スペース)を使う場合の注意事項

コマンドライン、シェルプログラムでは空白文字(スペース)は区切り文字
として機能します。

#!/bin/bash
line="    AAA BBB   CCC DDD"
echo ${line}
echo -n "["
echo " 123 4 5" | while read -rN 1 c
do
     echo -n "$c"
done
echo "]"

この実行結果は、

AAA BBB CCC DDD
[12345]

となります。
空白文字(スペース)は1文字にまとめられたり、削除されてりしています。
(逆に単語(ワード)部分の取り出しは楽になります)

コマンドラインでの利用では問題ないのですが、
echo ${line}  > /dev/ttyUSB0
echo -n "$c" > /dev/ttyUSB0

とかやって、通信データとし空白文字(スペース)もちゃんと送信したい場合は
当然問題となります。

この勝手に空白文字(スペース)をいじられないよにするには、
環境変数IFS(フィールドセパレータ)に空白文字(スペース)を入れないようにします。
デフォルトの設定の確認
  # set | grep IFS
  IFS=$' \t\n'

これを、シェルプログラム内でのみ、IFS=$'\n' として、セパレータは改行文字のみにします。

#!/bin/bash
PRE_IFS=$IFS
IFS=$'\n'
line="    AAA BBB   CCC DDD"
echo ${line}
echo -n "["
echo " 123 4 5" | while read -rN 1 c
do
     echo -n "$c"
done
echo "]"
IFS=$PRE_IFS

この実行結果は、

    AAA BBB   CCC DDD
[ 123 4 5]

無加工の出力となります。

デバイスがブロックされる場合の対応

通信条件を設定した後、
  # cat /dev/ttyUSB01

とすると、シリアル通信データを簡単に表示出来ます。
ただし、受信待ちとなって終了しない場合があります。

調べたのですが、シェルプログラムでのタイムアウトの設定が分かりませんでした。
stty当たりの設定で何とかならないか調べたのですが分かりませんでした。

そこでtimeoutコマンドを使って、タイムアウトを実現しました。
私の使っているCentOSでは標準で用意されているコマンドのようです。
# timeout 2 cat /dev/ttyUSB0

とすると、2秒待ちのタイムアウトとなります。
特定のコマンドをarduinoに送って、その結果を幾つか受信するような場合は、

#!/bin/bash
PRE_IFS=$IFS
IFS=$'\n'
tty="/dev/ttyUSB0"
stty -F ${tty} 115200 \
-parenb -parodd cs8 -hupcl -cstopb cread clocal -crtscts \
-iuclc -ixany -imaxbel -iutf8 -opost -olcuc -ocrnl -onlcr \
-onocr -onlret -ofill -ofdel nl0 cr0 tab0 bs0 vt0 ff0 -isig \
-icanon -iexten -echo -echoe -echok -echonl -noflsh -xcase \
-tostop -echoprt -echoctl -echoke

echo  -n "$1" > ${tty}
echo  -e "\n" > ${tty}
timeout 2 cat ${tty} | while read line
do
  echo "${line}"
  usleep 1000
done
echo "" > ${tty}
IFS=$PRE_IFS

こんな感じで、対応しています。
例では、コマンドラインの文字列を送信して、その結果として
複数のデータを表示するとうものです。

シリアル通信デバイスの利用権限 (2016/01/19 追記)
USB-UARTモジュールをLinuxマシンに挿入して利用権限を調べると次のように
なっています(CentOS 6.4 、Raspbian Jessieで確認)
$ ls -l /dev/ttyU*
crw-rw---- 1 root dialout 188, 0  1月 19 00:11 /dev/ttyUSB0

グループ dialoutに利用権限があります。
そこで一般ユーザがシリアル通信デバイスを気楽に利用できるようにするには
グループ dialoutに登録すればよいです。

#sudo gpasswd -a USER dialout
または(ubuntu、Raspbian Jessieの場合)
#sudo adduser USER dialout

これでUSERがdialoutの一員になり以降、/dev/ttyUSBxxxや/dev/ttyACMxxが
使えると思います。

関連記事
  ・IchigoJam用の支援ツールLinux版を作成しました ・・・ シェルプログラムでシリアル通信
  ・Raspberry Pi 2(Raspbian Jessie) のGPIOのシリアルポートを使う
  ・Raspbian Jessie のGPIOまわりの利用権限
 

2015年1月26日 (月)

Arduinoで16x16 LEDドットマトリックスを利用する(8)

ちょっと間が空きましたが、前回の続きです。

漢字用フラッシュメモリを基板上に載せて、前回よりも更にシンプルになりました。
更に、漢字フォント周りのプログラムをライブラリ化して使いやすくしました。
(現在、ライブラリのテスト中です)

Dscn3561

実際の動作



デモでは、ランダムにフォントサイズを変えて「いろは歌」をスクロール表示しています。
漢字フォントは8、10、12、14、16、20、24ドットの7種類の漢字が同時に使えます。

16x16の表示領域しかなくても、24x24ドットの漢字が意外と読めますね。
ちょっとビックリです。

このデモの作成において、
ビットマップ操作(表示パターンの加工、切り貼り)が無茶苦茶苦労しました。
任意サイズのビットマップ上の任意の位置に任意サイズのビットマップを書く等、
意外と面倒ですね。

実装面のお話
当初、漢字用フォント格納用のフラッシュメモリとして W25Q64VBを使っていましたが、
安い4MバイトのW25Q32BVSIGに変更しました。10個で$3.8なので1個40円くらいです。

Dscn3562

Dscn3563

フォントデータの書込みは、以前購入したCH341A programmerを利用しました。
SOPパッケージのため下駄を履かせて焼きました。

Dscn3569

焼いたフラッシュメモリは三端子レギュレータ、レベルコンバーターを使って
3.3V <=> 5Vの変換を行った回路を付加して、強引に載せます。

Dscn3557

う〜ん、なんて汚い基板でしょう。これで動いているのが不思議です。

W25Q64VBからW25Q32BVSIGからの変更しても、
プログラムの修正は無しで利用出来ました。

表示部のドットマトリックスの制御は、この前調査したHT16K33に変更する予定です。
現在制御にICをTB62706中心として5つ使っていますが2個で済みます。

このバージョンでは、汎用的なライブラリの実装に重点を置いて完成させます。

高々、16x16の表示なのに意外と面倒です。

2015年1月21日 (水)

IchigoJamで作成したプログラムをパソコンにロード/セーブする

2015/05/25 GUIベースのツールも修正版しました 詳細は こちら



2015/01/28  記事を大幅修正しました

2015/02/08  記事を追記・修正、配布ファールのバージョンを更新しました
2015/06/14  配布ファールのバージョンを更新しました.

IchigoJamがじわじわをメディアに取り上げられてきていますね。
個人的には基板剥き出しではなく、MSXみたいな拡張スロットでIO拡張するような
形式にして欲しいなぁ。

さて、本題に入ります。
現在使っていてちょっと不便に感じるのは、作成したブログラムの保存ですね。

本体に保存は出来るのですが、プログラムを沢山作成した場合に対応できません。
好きな時に好きなプログラムを動かしたいです。

大きい画面のパソコンでプログラムを確認したり、ホームページに掲載されている
サンプルプログラムを気軽に動かしてみたいです。
公開や配布が不便だと思っております。

そこで、本日は休暇のためちょっとツールを作ってみました。

作成したツールの概要
 
IchigoJamで作成したプログラムをパソコンに取り込んだり、逆にパソコンから
  IchigoJamに転送するツールです。
  コマンドプロント上で動かして使います。

  本ツールを利用するには、シリアル接続を行う製品が別途必要となります。
  シリアル接続を行う製品、頻繁にファームウェアの改良が行われているので、
  ほとんど必須アイテムですね。

  ツール(コマンド)
 rsave.exe リモートセーブコマンド
      IchigoJam上のプログラムをパソコン上に保存します。 

  rload.exe リモートロードコマンド
      パソコン上のプログラムをIchigoJamにロードします。

  rcmd.exe リモート実行コマンド
      IchigoJam上で任意のコマンドを実行します。

突貫工事で作成したプログラムでテスト不十分な感がありますが公開します。

ダウンロードはこちら :ichigotools06.zip
  解凍すると、RLOAD.EXE とRSAVE.EXE、RCMD.EXE が得られます。
 
  <
      2015/01/22 修正

       環境により、MSVCR120.dll がないと動作ようです。
       このエラーが出ないように、プログラムを修正しました。

      2015/02/08 修正
       rloadコマンドを使う場合、1行の文字列が長いと文字抜けが発生する
        場合がありました。その修正をしました。
      2015/06/14 修正
       ファームウェアの更新によりrcmd、rsaveで出力が取り込めないエラーを修正しました。
 

  実行モジュールを含んでいるためブラウザが警告を出す場合がありますが、
  継続等を選択して続行して下さい。
   また、解凍した実行モジュールにはセキュリティのブロックがされている場合が
  あります。プロパティを開いて[ブロック解除]をしてから使って下さい。

  05

利用に必要なもの
・IchgoJam本体
・Windowsパソコン
・IchgoJamとパソコンでシリアル通信するための機器(3.3V対応であること)

 

  上記のような製品ですが、一般的には"USB-UART変換モジュール"と呼ばれています。
  様々な製品がありますが、次の条件を満たしていれば何でも良いです。
    1)3.3V対応であること(これは重要! 5V出力だとIchgoJamが壊れる可能性あり)
    2)信号線として GND、TXD、RXDがあればOK
    3)利用の際には、ドライバーソフトが必要なので、入手かつインストールが自力で
       出来ること。
       ドライバーソフトは製品で採用しているチップ(IC)により、入手のレベルが
       変わります。FTDI 社の正規ICが採用されていると、自動でインストール出来ます。
       (その分ちょっと高いです)。
       Silicon Labs社のCP210X、中華WCHのCH340とかが乗っている製品は安いです。
       写真は、CP2102搭載で240円くらいで入手したものです。


環境および手順
  1)IchigoJamとパソコン間のシリアル通信のための結線
    ・シリアル通信のための結線 ・・ 3線のみ
         IchigoJam側    USB-UART
         GND(22ピン)        GND
         RXD(15ピン)         TXD
         TXD(16ピン)         RXD 

    ・結線したらIchigoJamの電源をONにし、USB-UARTモジュールもパソコンに
     接続して通信可能な状態にします。

     ここで、結線には"ジャンパワイヤ"とか呼ばれている、電線を使ています。
     電線の両端が端子に接続しやすいようにオス、メス型になっています。
     IchigoJamはメス端子、USB-UARTモジュールはオス端子なので、
     ジャンパワイヤの片方がオス、もう片方がメスのものを使っています。
     これもあると何かとよいと思います。

   Dscn3553

  2)ツールを使う
     ・コマンドプロントを開き、ダウンロードしたコマンドが実行可能な状態にします。
      (パスを通す、ダウンロードしたフォルダに移動する等)
       01

     ・RSAVEコマンドでIchigoJamのプログラムをパソコンに保存する場合
       rsave com5 hogehoge.txt      
        02

        コマンドを実行すると、IchigoJam上で"LIST" コマンドを実行して、
        その結果を指定したファイルに保存します。
        保存形式はプレーンテキストなので、メモ帳で開くことが出来ます。

     ・RLOADコマンドでパソコン上のプログラムソースをIchigoJamにロードする場合
       rload com5 hogehoge.txt
       03

       コマンドを実行すると、 IchigoJam上で"NEW" コマンドを実行して、
       プログラムを消去後、1行単位でプログラムを転送します。
       1行毎に0.8秒の待ちを行っているので、プログラム行数が多いと時間がかかります。
       待ちを行わないとデータの取りこぼしが発生するので入れています。

     ・RCMDコマンドでIchigoJamで命令文を実行する場合
       rcmd com5  PRINT 1+1
       rcmd com5  PRINT \"Hello World\"
       rcmd com5  PRINT 1+1
       rcmd com5  "LED 1:WAIT 50:LED 0:WAIT 50"
      
       シリアル通信経由で、IchigoJam上でコマンドを実行します。
       実行した出力結果はシリアル通信でパソコンで取り込み、表示します。
       PRINT文などで使う "(ダブルクォーテーション)文字を使う場合は、\” とします。
       ゲーム等のスクリーン座標を制御するプログラムの実行には向きません。

       ※ 本コマンド、実行結果の表示の最終行にゴミが表示される場合がありますが、
          気にしないで下さい。    

     06

< 2015/02/08 追記
  実際の利用では、サクラエディタからこれらのコマンドを呼び出して使っています。

  Photo

 
外部呼出しマクロを作成し、メニューに登録しています。
 
  エディタから、現在編集中のソースをIchighoJamにアップロードしたり、
  IchighoJam上のソースを取り込んだり、アップロードしたプログラム実行したり
  できます。



注意事項

    プログラムソースはテキスト形式ですが、IchigoJamとパソコンで扱える文字で
    異なる部分があるので、文字化けが発生する場合があります。
    取りあえず、半角カタカナは問題ないみたいです。

    あまりデバッグを行っていないので、他の環境では正常に動かないかもしれません。

おまけ:コマンドプロントで簡易的にIchigoJamの操作を行う方法
    パソコンとIchigoJamを同時に使っている時、キーボードが1つで済むのでちょっと
    便利な技です。

    まずは、シリアル通信が確立しているものとし、ポートCOM5を例に説明します。

    MODEコマンドでシリアル通信の設定を行った後、
 > mode COM5 BAUD=115200 PARITY=n DATA=8 STOP=1 to=off xon=off odsr=off octs=off dtr=off rts=off idsr=off      
    > TYPE CON > COM5
    と実行すると、入力した文字列をそのままIchigoJamに転送してコマンドの実行が
    出来ます。

   04

   上の画面はlistコマンドを実行しています。
   結果はIchigoJamに接続しているモニターに表示されます。
   フルスクリーン操作は出来ませんが、ロード/セーブ時の確認には使えます。

   CTRL+Zを入力後、ENTERキーを押すと終了します。
   私は入力がめんどいのでバッチコマンドを作って利用しています。
     setserial.bat com5
 
  中身
     mode %1: BAUD=115200 PARITY=n DATA=8 STOP=1 to=off xon=off odsr=off octs=off dtr=off rts=off idsr=off
   
  送信が出来るのなら、受信も出来るはずと、
  TYPE COM5 > hogehoge.txt

  をやっても何故かうまく行きません。
  何か方法があるかも..

こちらに、続きの記事があります。

2015年1月19日 (月)

IchigoJamのファームウェアを0.91に更新しました

2015/05/23 追記
この記事の内容は古いです。IchigoJamのファームウェアの更新については、
「IchigoJamのファームウェアのアップデートについて」を参照下さい。

IchigoJamのグループサイト IchigoJam-FAN(https://www.facebook.com/groups/ichigojam) にて
新しいファームウェア 0.91が公開されていたので、ファームウェアの更新を行いました。

MML(ミュージック・マクロ・ランゲージ)に対応となり、
PLAY命令で音が出せるようになりました(例:PLAY "CDE2 CDE2 GEDC CED2")。

早速ファームウェアの更新に取り掛かったのですが、
前にやったのに作業手順をすっかり忘れれしまいました。

そこで、今回は作業メモを残しておきます。
ついでに、書込みはこの前購入した「CP2102搭載 USB-UART変換モジュール」
やってみました。

作業メモ(Windows 8.1)
あくまでも自分用です。前回と同様に、
JF1VRUさんのブログ「活動の備忘録」の 記事「ichigojam ファームウェアの更新」
を参考にさせて頂いて作業を行いましたが、かなり自己流にかえています。

1)結線
   ・電源はmicroUSBケーブルから取得します。
   ・結線前に本体のスイッチはOFFにしておきます。
   ・USB-UART変換モジュールはPCと未接続にしておきます。

   ・シリアル通信のための結線 ・・ 3線のみ(ただし3.3Vであること)
         IchigoJam側    USB-UART
         GND(22ピン)        GND
         RXD(15ピン)         TXD
         TXD(16ピン)         RXD

    ・ISP(In-System Programming)書込みモードの設定
        IchigoJam
           - ISP(24ピン)       を  GND(8ピン)に接続
           - RESET(23ピン)  を  GND(8ピン)に接続
       ブレッドボードを利用して、上記3ピンを結線します。

   
 Dscn3529

  Dscn3530

2)Flash Magicの準備
  ・USB-UART変換モジュールをPCに接続し、接続したCOM Portを調べます。
  ・Flash Magicを起動し、次のような画面の項目に設定します。
  ・[Browse...]ボタンでダウンロードしたファームウェア(HEX形式)を指定します。

02

3)Flash Magicと IchigoJamとの接続の確立
  ・IchigoJamのスイッチをONにするとLEDが点灯してファームウェアの更新モードで
   立ち上がります。ただしまだリセット状態です。
  ・立ち上がり後、RESET(23ピン)をGND(8ピン)から抜くことで、通信可能な状態
   となります。
 
  ・Flash Magicの虫眼鏡ボタンを押して、データの取得が出来るか確認します。
   データ取得には数秒かかります。
   
   01
   
   エラーの発生なく、上記の画面が表示出来れば通信可能状態です。

4)ファームウェアの更新
   Flash Magicの[Start]ボタンを押します。これで書込みが実行されます。
   書込みには数分かかります。

5)動作確認
   ・本体のスイッチをOFFにして、ISP、GND、RESETの結線は外します。
   ・本体のスイッチをONにします。

  Dscn3545

ファームウェアの更新をしても、保存しているプログラムは消えないようです。
LOADコマンドを実行したら、ロードできました。
外部12MHzクリスタル用のファームウェアにしたら、表示のちらつきが軽減されました。
ノイズの影響っぽい揺らぎがなくなった感じです。

早速、PLAY文で音をだしてみました。ちょっと音程がずれている感がありますが、
効果音に使えそうです。ただ、音を鳴らすと画面にちらつきが発生しますね。

  Dscn3546

2015年1月18日 (日)

HT16K33を2つ使ってLEDドットマトリックスを制御してみた

前回の続きです。

HT16K33を2つ使用して4つの8x8LEDドットマトリックスの表示を試してみました。

Dscn3524

配線がちょと大変でしたが、結論としては、全く問題無しです。
表示遅れやパターンの波うち等は無いです。
I2C接続なのでArduinoとの接続は4線のみです。
MAX7219よりも使いやすいです。

さらに、データーシートでは5V駆動なのですが、3.3Vでも全く問題無く動きました。
輝度の指定はコマンドで設定するのですが、最低にしても明るいです。

複数利用について
HT16K33(28 SOP-A版)は、個々にI2Cアドレスの設定が出来ます。
下図のように抵抗とダイオードでアドレス設定します。
ダイオードは手持ちの1N4148を利用しました。抵抗は39KΩを持っていなかったので
51KΩを利用しましたが、問題なく動作しました。

01
3ビット分のアドレス領域があるので同時に8個の利用が可能です。
今回使った2つのうち、1つはアドレス指定なし、もう一つはA0に抵抗を接続して
異なるアドレスとしました。

動作の様子



スケッチ

#include <Wire.h>

// アドレス
#define HT_I2C_ADDRESS 0x70

// コマンド
#define HT_CMS_DATA       0x00
#define HT_CMD_SYSSET     0x20
#define HT_CMD_BLINK      0x80
#define HT_CMD_BRIGHTNESS 0xE0

// System Setup レジスタ設定値
#define HT_SYSSET_OSC_ON  1

// Display setup 設定値
#define HT_BLINK_DISPLAY_ON B00000001
#define HT_BLINK_OFF        B00000000
#define HT_BLINK_2HZ        B00000010
#define HT_BLINK_1HZ        B00000100
#define HT_BLINK_05HZ       B00000110

// 表示パターン用バッファ(R16xC8)
uint32_t buff[8];  
uint8_t raw[32];

// テスト用パターン('さ','い','た','ま')
uint8_t font[4][8] = {
  {0x08,0x08,0x7E,0x04,0x24,0x40,0x3C,0x00},  // さ
  {0x00,0x88,0x84,0x82,0x82,0x50,0x20,0x00},  // い
  {0x20,0xF0,0x2E,0x40,0x48,0x50,0x8E,0x00},  // た
  {0x08,0x7E,0x08,0x7E,0x08,0x7C,0x7A,0x00}   // ま
};

// HT16K33の初期化
void ht_init() {
  Wire.begin();

  // #1
  ht_system_Seup(HT_I2C_ADDRESS, HT_SYSSET_OSC_ON);  // システムオシレータをONにする
  ht_display_setup(HT_I2C_ADDRESS,HT_BLINK_OFF) ;    // 点滅表示周期の設定
  ht_setBrightness(HT_I2C_ADDRESS,1);                // 明るさの設定

  // #2
  ht_system_Seup(HT_I2C_ADDRESS+1, HT_SYSSET_OSC_ON);  // システムオシレータをONにする
  ht_display_setup(HT_I2C_ADDRESS+1,HT_BLINK_OFF) ;    // 点滅表示周期の設定
  ht_setBrightness(HT_I2C_ADDRESS+1,1);                // 明るさの設定
}

// SystemSetup Registerの設定
// (システムオシレータのモード設定)
void ht_system_Seup(uint8_t addr, uint8_t p) {
  Wire.beginTransmission(addr);
  Wire.write(HT_CMD_SYSSET | p);
  Wire.endTransmission(); 
} 

// 明るさの設定
void  ht_setBrightness(uint8_t addr, uint8_t p) {
  if (p > 15) p = 15;
  Wire.beginTransmission(addr);
  Wire.write(HT_CMD_BRIGHTNESS | p);
  Wire.endTransmission(); 
}

// Display setup(点滅周期の設定)
void ht_display_setup(uint8_t addr, uint8_t p) {
  if (p > 3) p = 0;
  Wire.beginTransmission(addr);  
  Wire.write(HT_CMD_BLINK | HT_BLINK_DISPLAY_ON | p); 
  Wire.endTransmission();
}

// 表示パターンの送信
void ht_write(void) {
  uint8_t d;
  uint32_t msk;
  uint8_t t;

  // バッファデータを表示用生データに変換する
  msk = 0x00000001;
  t = 0;  
  for (uint8_t x=0; x <32; x++) {
   d = 0;
    for (uint8_t y=0; y < 8; y++) {
      if (msk & buff[y]) {
        d |= _BV(y);
      }
    }
    raw[t] = d;
    msk <<=1;
    t++;
  } 
  
  // HT16K33 #1 にデータ転送
  Wire.beginTransmission(HT_I2C_ADDRESS);
  Wire.write(HT_CMS_DATA);
  for (uint8_t i=0; i<8; i++) {
    Wire.write(raw[i+24]);    
    Wire.write(raw[i+16]);    
  }
  Wire.endTransmission();  

  // HT16K33 #2 にデータ転送
  Wire.beginTransmission(HT_I2C_ADDRESS+1);
  Wire.write(HT_CMS_DATA);
  for (uint8_t i=0; i<8; i++) {
    Wire.write(raw[i+8]);    
    Wire.write(raw[i]);    
  }
  Wire.endTransmission();  
}

// バッファのクリア
void ht_clear_buffer() {
    for (uint8_t i=0; i <8; i++) 
      buff[i] = 0;
}

// 表示のクリア
void ht_clear() {
  ht_clear_buffer();
  ht_write();
}

// バッファの指定座標のON/OFF
void ht_set_dot_buffer(uint8_t x, uint8_t y, uint8_t d) {
  if (d) {
    buff[y] |= 0x80000000 >> x;
  } else {
    buff[y] &= ~(0x80000000 >>x);
  }   
}

// バッファ上の指定座標に8x8パターンをセット
void write_bufat(uint8_t* fptr, uint8_t x, uint8_t y) {
  if (x>32 || y >7)
    return ;     
  for (byte j=y,i=0; i < 8; j++,i++)
    buff[j] |= (((uint32_t)(fptr[i]))<<24) >>x;
}

// バッファ上の指定座標に8x8パターンをセット(負座標指定可能)
void write_bufat2(uint8_t* fptr, int8_t x, int8_t y) {
  if (x>31 || y >7 || x < -7 || y <-7)
    return ;
  for (int8_t i=0,j=y; i < 8; i++,j++) {
    if (j>=0) {
      if (x>=0)
        buff[j] |= (((uint32_t)(fptr[i]))<<24) >>x;
      else 
        buff[j] |= (((uint32_t)(fptr[i]))<<24) <<(-x);      
    }
  }
}

// バッファ左スクロール
void scroll() {
   for (uint8_t i=0; i < 8; i++) {
      buff[i]<<=1;  // 各行を左にシフトする
   }
}

void setup() {
   ht_init();
   ht_clear();
}

void demo_test() {
  ht_clear();
  
  // バッファに"さいたま"のパターンを書き込む
  for (uint8_t i=0; i <4; i++) {
    write_bufat(font[i],i<<3, 0);
  }
    
  ht_write(); // バッファの内容を表示
  delay(500);
  
  // スクロール
  for (uint8_t i=0; i < 32; i++) {
    scroll();    // バッファ内を1ドット左にシフト
    ht_write();  // バッファの内容を表示
    delay(100);
  }  
}

// 指定座標へのパターン書込み
void demo_test2() {
  for (int8_t y=-7; y<8; y++) {
    for (int8_t x=-7; x<32; x++) {
     ht_clear_buffer();
     write_bufat2(font[0],x, y);
     ht_write();  // バッファの内容を表示
     delay(100);
    }
  }  
}  
  
void loop() {
 demo_test();
 delay(1000);  
 demo_test2();
 delay(1000);  
}

回路図は、データーシートのApplication Circuitのまんまなので作ってません。
8x8LEDマトリックス(HSN-0788UR)とHT16K33との配線接続表を作成して
配線しました。

01_2

色々と使えそうです。表示器をモジュール化してみようと思います。

2015年1月14日 (水)

HT16K33を使った8x16 LEDドットマトリックスの表示

Aliexpressで購入して放置していた LEDドライバ HT16K33 を使ってみました。
8x8 LEDドットマトリックス を2個(8x16) 直接制御できます。
arduinoからはI2Cバスで接続して制御できます。

Dscn3515

01

ブレレッドボードで使うには1.27mm 28pin SOP がちょっと面倒です。
今回は2.54mmに変換する基板を利用しました。

Dscn3513

配線が多いですが、部品は少なくて意外と楽です。

取りあえずデーターシートを読んで、簡単なサンプルプログラムを作成しました。
I2Cでのやり取りのコマンドも簡単でシンプルで使いやすいです。

ライブラリも公開されているので試してみました(トップの写真)。
 ライブラリ: adafruit/Adafruit-LED-Backpack-Library

ただし、利用しているLEDドットマトリックスの都合上、
そのままでは利用出来ませんでした。

データシード上のROWとCOLは次のような配線を要求しています。

02

これに従って私の持つ8x8 LED ドットマトリックスを使うには、次のように配置します。
(黒い●は接続ピンヘッダです)

03

しかしブレッドボード上に載せる都合上、こんな感じにしないとダメです。

       04
そこで、表示用パターンを出力する前に、パターンデータを変換するよう、
Adafruit_LEDBackpack.cpp のwriteDisplay()を修正しました(下記)。

void Adafruit_LEDBackpack::writeDisplay(void) {
 
  // <<-- 追加 ここから
  uint8_t raw[16];
  uint8_t d;
  uint16_t msk;
  uint8_t t = 0;

  msk = 0x8000;
  for (uint8_t x=0; x <16;x++) {
   d = 0;
    for (uint8_t y=0; y < 8; y++) {
      if (msk & displaybuffer[y]) {
        d |= _BV(y);
      }
    }
    raw[t] = d;
    msk >>=1;
    t++;
  }
  // 追加 ここまで -->>
	
 Wire.beginTransmission(i2c_addr);
  Wire.write((uint8_t)0x00); // start at address $00

  for (uint8_t i=0; i<8; i++) {

/* 2行を差し換え
    Wire.write(displaybuffer[i] & 0xFF);    
    Wire.write(displaybuffer[i] >> 8);    
*/
    Wire.write(raw[i+8]);    
    Wire.write(raw[i]);    
  }
	
  Wire.endTransmission();  
}

adafruit/Adafruit-LED-Backpack-Library はちょっと多機能でデカすぎなので、
自作のライブラリを制作しています。

製作中の16x16ドットマトリックスの実装、このIC使った方が楽そうです。
使うICは2個だけで済みますし..

2015年1月13日 (火)

Android-x86 4.4-r2(VirtualBox)の画面解像度の変更

Android-x86 4.4-r2をVirtualBoxの仮想マシン上で動かした場合の
画面解像度の変更方法のメモです。

1. 起動時に画面解像度を指定する方法

01

起動直後のGRUB画面で
"Android-x86 4.4-r2"を選択した状態でキーボードの 'a' を押します。
これで、起動時のパラメタの追加指定が出来ます。

03

上記の画面のように、" vga=791" と入力して[ENTER]キーを押します。
USキーボードのため、'='の入力は[^]キーになります。

これで 1024x768x16(16ビット色) で起動します。

他の解像度の指定方法を確認&指定したい場合は、"vga=ask" とします。

04

この表示のModeの値(16進数)を"vga=xxx" のxxxに指定するのですが、
xxxは10進数で指定しなければなりません。

1024x768x16のModeは317(16進数) を 10進数に変換すると 791となります。
この変換は電卓を利用すると良いです(表示メニューでプログラマを指定する)。

05

ビデオカードがVGA/VESA互換の都合上、解像度を高くすると32ビットのモードを
指定すると起動に失敗するようです。

この画面で"791" と入力して解像度を変更して起動が出来ます。

2.メニューに任意の解像度で起動する項目を追加する

いちいち指定するのも面倒なので、GRUBのメニューに追加します。
仮想マシンを起動し、"Android-x86 4.4-r2 (Debug mode)を選択します。

06

次の画面の状態で起動し、root権限でログインした状態になります。

07

確認すると、
grubのメニュー定義ファイル menu.list があるパーティション /dev/block/sda1は
/mnt に リードオンリーの状態でマウントされています。

08

書込み可能な状態で再マウントして、vi エディタで開いて編集します。

# cd /
# mount -o remount  -rw /mnt
# vi /mnt/grub/menu.lst

09

先頭のtitle 〜 の3行をコピーして新しいメニューを追加します。
タイトルを変更します。
2行目の後ろに "vga=317" を追加します。

title Android-x86 4.4-r2(1024x768)
kernel /android-4.4-r2/kernel quiet root=/dev/ram0 androidboot.hardware=android_x86 SRC=/android-4.4-r2 vga=791

initrd /android-4.4-r2/initrd.img

USキーボード配列のため、記号等はキーが異なることに注意です。
次の配列になっています。

12

追加した状態は次のような感じです。

10

保存して、viを終了し、exitを2回実行してコマンドモードを抜けます。
これで、androidが起動します。

仮想マシンをリセットして、再起動しメニューに追加されていることを確認します。

11

追加したメニューを選択してAndroidを起動します。
これで画面解像度が1024x768の状態でAndroidが起動します。

13_3




2015年1月10日 (土)

ReadyNASでMySQLが起動しなくなった その原因と対処メモ

ReadyNAS duo v2 に標準搭載のMySQLが何故か起動しなくなってしまいました。

原因を調べてると、
アドオン機能の「ReadyNAS Photos II」を無効にすると
MySQLのデーモン(mysqld)が起動しないことが判明しました。

有効にしたらMySQLが起動出来ました。
う〜ん、予想外の仕様です。

01_2

ReadyNAS duo v2の場合、mysqldの起動は
  /opt/photos2/bin/rnp2sd.sh
というアドオン起動用のシェルプログラムから起動されています。
/etc/init.d/mysql は使われていません。

どうも、MYSQLが標準でインストールされているのは「ReadyNAS Photos II」 の
ためだけみたいです。しかもアドオンの有効の場合のみ起動します。
/opt/photos2/bin/rnp2sd.sh がアドオン用のスタートアップを行っており、
その中でmysql を直接起動しています。

取りあえずは解決ですが、ちょっと突っ込んで調べてみました。

ReadyNAS duo v2 のOSは一応debianベースのLinuxですが、
OS起動時のサービスの起動シーケンスがカスタマイズされています。

まずは/etc/inittabの内容の確認を見ると、
 02_3

デフォルトのランレベルは2となっています。
  03_3

  ランレベルが2の場合 、"/etc/init.d/rc 2" を実行するようです。

次に /etc/init.d/rc の内容を確認と /etc/rc2.d/にあるスクリプトを順次実行します。
/etc/rc2.d/には S01readynas_startup のみがあります。

この S01readynas_startup の中を見ると この中で必要な初期化やサーバーの起動の
全てを行っているようです。

以後、カスタマイズを行う場合やサービスを追加する場合は、
S01readynas_startup  をいじれば良さそうです。

Android-x86 4.4-r2を VirtualBoxの仮想マシンで利用してみた

www.android-x86.orgにてAndroid-x86 4.4-r2がリリースされたので試してみました。

29

以前はWindows 8.1のHyper-VでAndroid-x86 4.4-RC2を試したのですが
Hyper-Vではマルチメディア関係やUSBディバイスの利用が出来ないの等の制約が
あるので今回は VirtualBox で利用してみました。
更に、ライブでのお試しではなくインストールを行てみました。

私の目的であるSony Reader や Dマガジンの電子書籍の閲覧は出来ませんでしたが、
セキュリティに厳しくないアプリケーションなら動作します。

取りあえず、VirtualBox でのインストールまでの手順をまとめます。
あらかじめVirtualBoxがインストールされているものとします。

インストール手順

1)Android-x86 4.4-r2のダウンロード
  Android-x86 4.4-r2 live & installation iso をダウンロードして利用しました。
   
以降はVirtualBoxでの操作です。

2)新規ボタンで仮想マシンの作成を行う。
  「名前とオペレーティングシステム」の設定
  01

  名前は任意、タイプ:Other、バージョン Other/Unknown

  「メモリーサイズ」の設定
   02
 
  取りあえず、2048MBを指定を設定しました。

  「ハードドライブ」
   03

  "仮想祖ライブを作成する" を選択して[作成]します。

  「ハードドライブのタイプ」の設定
  04

  デフォルトの[VDI]を指定しました。

 「物理ハードドライブにあるストレージ」の設定
  05

  取りあえず"可変サイズ"を指定しました。

  「ファイルの場所とサイズ」の設定
  06
 
  フォルダ、ファイル名、サイズを指定します。取りあえず8Gバイトあればよいでしょう。

3)ISOファイルの指定
  [設定]ボタンを押して、[ストレージ]を選択し[CD/DVD]にダウンロードした
  android-x86-4.4-r2.iso を指定します。
07

4)起動してインストール
02_2

"Installation - Install Android-x86 to harddisk"を指定します。

パーティションの作成
"Create/Modify partitions"を選択します。
03_2

04_2

[New]を選択します。

05_2

[Primary]を選択します。

06_2

サイズはデフォルトのままとし、[Enter]を押します。

07_2

[Bootable]を指定します。

08

[Write]を選択して、書込みます。

09

"yes"と入力して[Enter]を押します。

10

[Quit]を選択して終了します。

11

[OK]を押します。

12

ファイルシステムの選択で"ext3"を選択して[OK]を押します。

13

[Yes]を押して、フォーマットします。

14

[Yes]を押してGRUBをインストールします。

15

/systemのマウント方法を指定します。ここは好きに選んでよいと思います。
[No]を押して、Read Onlyでマウントするように指定しました。

16

フォーマットするが行われます。

17_3

"Reboot" を選択します。ただしリブート後、一旦仮想マシンを終了して
設定画面を開き、DVDからISOファイルのマウントを解除します。

19

ISOを指定したままだと、またDVDからの起動となってしまいます。

仮想マシンを起動します。

20

Android-x86 4.4-r2 を選択して起動させます。

21

あとは、通常のandroidとして、初期設定等を行います。

27

28

仮想マシンとして使う上で、
「スリープモードにしない」の設定と、画面の自動回転はしないように設定した方が
よいと思われます。

もしスリープモードになってしまった場合は、[仮想マシン]メニューの[ACPIシャットダウン]
を選択すると、スリープモードが抜け出してくれるみたいです。


続き: 「Android-x86 4.4-r2(VirtualBox)の画面解像度の変更」

 

2015年1月 5日 (月)

CP2102搭載 USB-UART変換モジュールを試してみる

Aliexpressにて格安CP2102搭載 USB-UART変換モジュールを購入しました。

10

届いた製品がこれです。

Dscn3508

Dscn3509

5Vと3.3Vの両方に対応しています。
端子はDTR、RXD、TXD、VCC(5V)、CTS、GNDがあり順番もFTDI Basicと同じです。
側面からも色々と信号が取り出せそうです。

これなら、arduino pro mini(5V 16MHz)と直結して書込みが出来ます。
IchigoJamにも使えそうです。

動作確認

Dscn3507

手持ちのarduino pro mini(5V 16MHz版)互換機で試してみました。
パソコン(Windows 8.1)に接続しても、ドライバーの自動認識はしてくれませんでした。

03

次のサイトからドライバーを入手してインストールしました。
SILICON LABS CP210x USB to UART Bridge VCP Drivers

06

解凍した中身を確認すると、比較的新しいようです。
07

Windows 8.1でも問題なくインストールできました。

05

テストとして、ASCIITableというスケッチを利用しました。
シリアル通信の速度は115200に変更しました。

08

書込みも正常に行えました。プログラムも問題なく動作しました。

09

取りあえずは使えそうです。

考察


このモジュールは3.3Vにも対応しているようですが、切替スイッチ等がありません。
CP2102のデータシートを見てみると、内部に3.3V レギュレータがあって3.3Vで
駆動しているようです。入出力も3.3V系見たいです。

念のため、TXDの電圧を図ってみました。

Dscn3511

やはり、3.3Vでした。5V出ていませんねぇ。疑ってよかった...
ロジック信号的には3.3Vも辛うじてHレベルと判定されるので動作していたみたいです。

一方のRXD端子(arduinoにはTXDに接続)を測定すると5Vでした。
3.3V入力端子に5V入力? これはまずいような気がします。

色々調べると、kumanさん ホームページ 「AVR試用記」にて
自作 USB-UARTコンバータ の紹介記事に解説がありまして、どうやら問題無いようです。
3.3V系、5V系の両方に対応出来るようです。

結論
これは結構使えます。

2015年1月 4日 (日)

格安 arduino Uno R3 互換機を購入しました

Aliexpressでarduino Uno R3 互換機$3.38で売っていたので試しに購入してみました。
クレジットカードの記録を見ると、日本円で424円でした。う〜ん、安い!

01_2

※ 現時点(2016/01/6)では送料込みで$6.11となっています。

<<< もっと安いの発見! 2015/05/04 追記

12

追記終わり >>>


<<< 更に安いものを発見!2016/01/06 追記

high quality UNO R3 MEGA328P CH340 CH340G for Arduino UNO R3 NO USB CABLE
私が持っているものと同じようです。

送料込みで500円以下は結構見つかります。

追記終わり >>>

到着した製品がこれです。見た感じでは、全く問題なしです。
CH340G搭載 互換機はこれで2代目です。

Dscn3504

このUSB-シリアル変換に CH340G を使っている互換機は、
DCcduino UNO と呼ばれているようです。Amazonでも販売されています。

Arduino UNO互換ボード DCcduino UNO
02_2

厳密にいうと、USB-シリアル変換にATmega16U2 を使っていない
(公開図面通りの仕様で実装していない)ので完全な互換機ではないですね。

ATmega16U2が乗っていないのでUSB経由のブートローダの書き込みや
ATmega16U2自体をカスタマイズじてUSBデバイス(マウスやキーボード化)化などして
遊ぶなどが出来ませんが、通常はやらないので問題ないでしょう。

   ブートローダの書込み行うと次のようなエラーとなる(= 完全な互換機ではない)
  (ブートローダの書き込みはISCP端子にUSBSP等を接続して行う)

   01

早速、Lチカ テストを行ってみます。

初めてDCcduino UNOを使う場合はCH340Gのドライバーの入手&インストールが
必要になります。ドライバはCHG340G開発メーカーのサイトから入手出来ます。
(CHG340GとCH341SERは同じドライバーを使います)

CH341SER.EXE or CH341SER.ZIP
  http://www.wch.cn/download/CH341SER_EXE.html
  http://www.wch.cn/download/CH341SER_ZIP.html

  こちらも参考になるかも aitendo USB-シリアル変換 [U2S-340G]

動作確認として、スケッチの例 blinkを選択して書き込みます。
書込み装置の指定はAVRISP mkIIでOKです。

03_2

まあ、問題なしですね。LEDがチカチカしました。

Dscn3505

基板の左側にシリアル通信+電源、I2C+電源のコネクタをつけると便利そうですね。
使えそうです。原価はいくらなんだろう。


ReadyNASのファームウェアの更新

利用してるReadyNAS duo v2のファームウェアの更新を行いました。
暫く更新していなかったので、バージョン 5.3.7から5.3.11への更新です。

アップデート後ちょっと問題が発生したため、その対処方法を記録として残しておきます。

   06

主な改善点

Fixed ADS domain logins over AFP immediately after joining the domain.
Fixed "ShellShock"-related security vulnerabilities
Updated CIFS service to address various issues.
Updated AFP service to address various issues.
Updated Frontview to fix security issues.
Updated Vault service to address various issues.
Updated SMB client to address backup issues.
Updated DLNA service to address folder renamed to NULL issue.
Fixed upgrade resets time zone issue.
Fixed reboot need rebuild DLNA list issue when use USB drive as source.
Changed Time Machine Bonjour advertisements to improve compatibility with Apple OS X 10.9
Fixed Time Machine capacity limitation issue
Changed SMB allocation roundup size to improve disk usage reporting with Microsoft Windows 8.1
Updated SMB service to address security vulnerability
Supports Internet Explorer 11

アップデートは、ReadyNASの管理画面にて[アップデート]ボタンを押すだけで行えます。

アップデート後の問題点
標準機能については問題がないのですが、以前インストールした
phpmyadminやWordpressが動かなくなってしまいました。PHPが動いていないようです。

「もしかして、追加インストールしたパッケージは初期化されるん?」
と焦って、phpをコマンドラインで動かすと問題なく動きました。

念のためインストールされているパッケージを確認してみると

# dpkg -l
パッケージ等の初期化は行われていないようです。

apache関連のモジュールが初期化されて感じです。
apacheに組み込まれているモジュールの確認してみると、
#apache2ctl -M -f /etc/frontview/apache/httpd.conf

モジュールが足りない気がする。
/etc/frontview/apache/下のファイルやディレクトリを見ると追加した
wordpressやphpmyadmmin等のconfファイルはちゃんとありました。

原因不明ですが、取りあえず/etc/frontview/apache/httpd.conf に
phpのモジュールをロードするために次の2行を最終行に追加しました。

   01

次の2行を追加
Include /etc/apache2/mods-available/php5.load
Include /etc/apache2/mods-available/php5.conf

apacheの再起動
# killall apache-ssl
# apache-ssl -f /etc/frontview/apache/httpd.conf

この後、動作確認するとphp関連のアプリケーションは問題なく動作しました。
MySQL周りも問題ないみたいです。

02

03

04

更新したファームウェア内のファイルを見た感じでは、/etc/frontview/apache/下の
変更はないみたいで、本来ならこんなトラブルが発生しないはずです。
まあ、今回はこれで良しとします。


2015年1月 2日 (金)

ATtiny13Aでダイソー プチ電車を赤外線リモコン操作してみた

前回のDRV8830を使ったDCモーターの制御(3)の続きです。

ATtiny13Aを使ったダイソー プチ電車の赤外線リモコン制御が完成しました。
結局、1.5Vの電池では電流出力が足らないようで3Vに変更しました。
(前回からの修正は電池のみ)
スケッチは修正なしです。

   01

上記の回路をユニバーサル基板に実装しました。
(2015/06/02 上記電源部+1.5Vのは間違えです。+3.0Vです)

表の部品配置

02

裏から見た配線

03

実装

Dscn3497

全体

Dscn3495

組み込み

Dscn3494

Dscn3493

実際の動作はこんな感じです。


実験中、助手のルミちゃんが耐久テストをしてくれました。もちろん合格ですw。

今回の回路ではDC-DCコンバータを使ていますが、無くてももそこそこ動作しました。
3Vでは赤外線センサーがちょっと反応が鈍くなりましたが、モーター回りは
問題ないようでした。
ATtiny13Aを使った工作、工夫すれば電池2本で色々と遊べそうです。

今回のは初号機ということで、ノイズやもう少し消費電力やモーターに流れる
電流等を検証してみたいと思います。

2015/06/02 追記

改めて見直して動作確認すると、DC-DCコンバータは不要です。
電池2本 3Vでも動作します。回路図を修正します。

01

基本に戻って、トランジスタを4つ使てHブリッジ&PWM制御も時間があれば試して
見たいです。



パソコン、かなり安いものが出てきました

Windows 8.1搭載のタブレット、デスクトップパソコンのお話しです。
国内でもかなり安い製品が出回ってきました。

よく使うAliexpressでも以前と比べるとかなり安い製品が売られています。
$100でも見た感じ、結構良さそうな製品があります。

タブレットPC
0002
8インチ 1280x800 RAM 2Gバイト  フラッシュメモリ 32Gバイト CPU Z3735F(4コア) 重さ 305g

小型デスクトップPC
0001
2GバイトRAM  32G2G RAM 32Gフラッシュメモリ フラッシュメモリ CPU Z3735F(4コア)

上の小型パソコンは思わす買いたくなっちゃいました。
OSが正規品でない場合があるので要注意ですが..

以前の1$ 90円なら1万円内で買えたのですが、今だと1万2千円、う〜ん今回は止めよう。

2015年1月 1日 (木)

明けましておめでとうございます

明けましておめでとうございます。
今年もよろしくお願いします。2015年が始まりました。

お洒落な猫ブログを目指すため、年明け最初のブログは
正月らしい、写真を取ってみました。

取りあえず、その辺りに飾っていた鏡餅とたまちゃんとのツーショット。

00

「!?」

01

「なんやこれ?」

02

恐る恐る、猫ぱ〜んち!

03

「くんかくんか」

04

「これ、食べていいの?」

05

「がぶりえ〜る」

うぎゃ、やめて〜
全然お洒落な、内容じゃない。

2015年 元旦

« 2014年12月 | トップページ | 2015年2月 »