GR-CITRUSとMIKANを試してみる(10)

前回はGR-CITRUSにSPI TFTを接続してディスプレイに表示できるところまでを紹介しました。今回はMIKANを使ってWebにアクセスして情報を取ってきて一旦SDカードに情報を格納すると共に、その情報から必要なものを抽出してディスプレイに表示してみます。

前回、当初SOFT SPIにてプログラムを組んでいましたが、SDカードとの同時利用ができなかったためSPI libを使ったプログラムに変更することで可能となりました。

Firmware_developが変更されているので前回紹介した

GitHub - ojisan/firmware_developからダウンロードしてください。

今回のテーマは為替情報の抽出です。処理の動きは下記のとおりです。

①為替情報をJSONで提供しているサイトに接続してUSドルの為替情報をSDカードに格納

②SDカードから為替情報を読み出して一旦配列にし、その後文字列に変換

③文字列からsplit(",")を使って区切って配列化

④配列化した情報の中から時刻情報と為替の値情報を抽出

⑤抽出した情報をディスプレイに表示

f:id:jf3rgskun:20170204213617j:plain

実際に作成したmrubyプログラムはつぎのとおりです。

CURRENCY_TFT.rb

GR-CITRUSとMIKANを試してみる(9)

今回はGR-CITRUSにTFTを接続してみました。私が試したSPI-TFTは、ILI9341を使ったもので、2.2インチサイズのQVGA(320×240)です。初め、SOFT SPIで試してみましたが、SD Cardと同時利用ができない不具合があったのでSPI libを使ってプログラムを作成してみました。SDカードをアクセスすると画面にゴミが残りますが同時利用はできるようです。また文字列を表示する際のポインターの受け渡しがうまくいかない場合があったのでプログラムを一部変更しました。

(1)GR-CITRUSとSPI TFTを下記のように接続します。

f:id:jf3rgskun:20170131075525j:plain

(2)GR-CITRUSのソースをmakeする環境をつぎのGR-CITRUSのmrubyソースをmakeする方法 - Qiitaを参考にして構築

(3)GR-CITRUS用のソースをつぎのGitHub - wakayamarb/wrbb-v2lib-firm: Wakayama.rb Ruby Board V2 library Firmwareからダウンロードしてきて環境を構築したRenesasフォルダに展開

(4)firmware_developフォルダーに移動し、gr_commonフォルダ内のlibフォルダに新規にTFTフォルダを作成

このフォルダに3つのファイルを作成SPI_TFT.cpp、SPI_TFT.h、font.h

(5)firmware_developフォルダーに移動し、wrbb_mrubyフォルダ内にsTFT.cpp、sTFT.hを新規に作成

(6)同じwrbb_mruby内のsSys.cppにTFTが使えるように追加、変更

(7)firmware_developフォルダーに移動し、上記追加したファイルがmakeできるようmakefileに下記を追加

・SRCFILESに./gr_common/lib/TFT/SPI_TFT.cpp、./wrbb_mruby/sTFT.cppを追加

・OBJFILESに./gr_common/lib/TFT/SPI_TFT.o、./wrbb_mruby/sTFT.o \を追加

・CCINCに-I./gr_common/lib/TFTを追加

・HEADERFILESに./gr_common/lib/TFT/SPI_TFT.hおよび ./gr_common/lib/TFT/font.h、./wrbb_mruby/sTFT.hを追加

(8)ここでmakeすると新しいcitrus_sketch.binができます。つぎにGR-CITRUSのリセットボタンを押すとUSBマスストレージとして認識されるのでcitrus_sketch.binをこのフォルダに移動させてファームを書き込みます。

(9)Rubicを開いて下記のTEST_TFT.rbを入力

TEST_TFT.rb

(10)実行するとこのように描画されます。

f:id:jf3rgskun:20170130204534j:plain

 (11)今回のTFT libを盛り込んだfirmware_developのソースはこちらです。

GitHub - ojisan/firmware_develop

 

GR-CITRUSとMIKANを試してみる(8)

前回はタンクをつくってみましたが、今回はジャイロセンサを使って倒立ロボットを作ってみました。参考にしたのはこのURLの製作記事です。

コントロール基板はタンクと同様です。異なるのは、下記の4点です。

①コントロール基板に供給する電源を3.7Vリチウムポリマー電池から別電源としました。タンクを製作した時に、モータの正逆回転時にマイコンがリセットされる症状が時々出ていました。別電源とすることでこの症状を回避することができました。

②タイヤは比較的安価なタミヤのオフロードタイヤセットを採用

③モータ用電源(単三×3本)と3.7Vリチウムポリマー電池はモータ取り付け位置の反対側に取り付け(バランス重視)

④コントロール基板は、モータ取り付け側の上部に水平に取り付け

そのため、ベースプレートにLアングル(2個)で取り付けました。よってジャイロセンサのY軸方向のみを使います。もし、コントロール基板をベースプレートと平行に取り付けると、ジャイロセンサのデータが異常な値となり、上手く倒立できません。

実際に作った倒立ロボットはつぎのとおりです。

f:id:jf3rgskun:20170110085338j:plain

f:id:jf3rgskun:20170110085347j:plain

mrubyで書いたプログラムはつぎのとおりです。ポイントは下記の4つです。

①今回WiFiは使わないので除いています。

②モータ制御に外部から値が変えられるように以下のメソッドを追加

ll_motorf(value),rr_motorf(value), ll_motorb(value), rr_motorb(value)

③ジャイロセンサからのデータを高速で入手する必要があるのでL3GD20_CTRL_REG1(0x20)の値を0xCF(OUTPUT DATA RATE を760Hz、Cut offを30Hz)に設定しています。また測定レンジを±250dpsと感度を高く設定しています。

④倒立させるにはk1~4のパラメータ@kAngle、@kOmega 、@kSpeed 、@kDistanceを設定する必要があります。カットアンドトライでこれらの値を変えますが、PCからUSBシリアルコマンドで設定できるようにプログラムを追加しています。

例えばTeraTermのブロードキャストコマンドからk1 120と入力して送信をクリックすると@kAngleの値が120に設定されます。

 

f:id:jf3rgskun:20170110103718j:plain

 

gistb28e54aaa9ffcb198cfd0e3b9689b3a5

動画はこちらです。


GR CITRUS inverted Robot

GR-CITRUSとMIKANを試してみる(7)

前回は、GR-CITRUSとAndroid携帯をMIKANを経由してWi-Fi接続してモータ制御するところまで完成しました。今回は、タミヤのタンク用部品とモータ制御基板を使っておもちゃのタンクを作ってみました。実際に作ったタンクはつぎのとおりです。単三3本のバッテリー(eneloop)から3.3Vレギュレータを介してGR-CITRUSとMIKANに供給しています。モータ電源はバッテリから直に接続しています。

レギュレータを介してモータに供給すると電流容量不足のため走りません。

f:id:jf3rgskun:20161206130226j:plain

実際の走行映像はこちらです。結構リスポンスよく動いているようです。


GR CITRUS tank

GR-CITRUSとMIKANを試してみる(6)

前回はPCとGR-CITRUSをMIKANを経由してWi-Fiでコントロールするのを試してみましたが、今回はAndroid携帯とGR-CITRUSをMIKANを経由してWi-Fiでコントロールしてみます。

主な変更点はつぎのとおりです。

①GR-CITRUSのmrubyプログラムの変更点は以前はモータ制御コマンド受け取るとPCのUIボタンを赤色にするよう応答してましたが、Androidのスレッドのタイミングでエラーになるので今回は応答を止めました。ジャイロセンサのデータのみ送出しています。Forwardモータでは赤色文字の箇所が該当します。

if(array[0] >= 0)then
 @Usb.println array[0].to_s
 if(array[0] == 0x66) then #//"f"
 #//WiFi.send 4, "MC11"
 l_motorf()
 r_motorf()
 @Usb.println("motor FF")
 end

AndroidのプログラムはメインのSimpleWifi.javaUdpクラスのUdp.javaから構成されています。今回はxmlを使わずに作成しました。UIボタンのレイアウトはRelativlayoutを使用し、PCのUIボタンのレイアウトと同じようにしています。

ジャイロセンサの計測コマンドはタイマクラスを使用しないでハンドラーを使って約1秒毎にGR-CITRUSに送出しています。またジャイロセンサのX,Y,ZデータはDispThreadとハンドラーを使ってUI画面に表示するようにしました。

昔、作成した古いプログラムを流用したので最新の記述になっていない箇所もあるかと思います。

実際のUI画面はつぎのとおりです。

f:id:jf3rgskun:20161203191232j:plain

 実際のプログラムはつぎのとおりです。

Android_Udp.rb

GR-CITRUSとMIKANを試してみる(5)

前回まではGR-CITRUSでジャイロセンサモジュールからデータを取得したり、モータ制御モジュールDRV8835でDCモータを制御するプログラムをそれぞれ単体で動作させました。今回はWi-FiモジュールMIKANを使ってPCとGR-CITRUSを通信させてみます。

主な内容はつぎのとおりです。

①PCとGR-CITRUSをUDP通信によりWi-Fi接続する。

②PCのソフトウエアはVisual Basicで作成する。

f:id:jf3rgskun:20161128092029j:plain

③動作内容

 ・PCのUI接続ボタンをクリックするとUDP通信を開始し、メッセージ窓に接続成功と表示 

 ・PCのUIボタン(前進・後退・左回転・右回転・STOP)をクリック

 ・モータを制御するコマンド("f”,"b","l","r","s")をGR-CITRUSに送付

 ・GR-CITRUSでコマンドを受け取るとモータを駆動を開始すると共にUIボタンを赤色にするようPCに応答

 ・計測開始ボタンをクリックするとジャイロセンサの計測開始コマンド("m")を500ms毎にGR-CITRUSに送付すると共にUIボタンの表示が停止に変化。

 ・ジャイロセンサのデータをPCに送付

 ・PCで受信したデータをメッセージ窓2に表示すると共にX,Y,ZのテキストBoxにそれぞれ表示させる。

 ・PCのUI終了ボタンをクリックするとUDP通信をクローズすると共にGR-CITRUSに終了コマンド("e")を送付

 ・GR-CITRUSで終了コマンドを受信するとUDP通信をクローズすると共にジャイロ計測、モータ制御停止

④GR-CITRUSのプログラムは今まで作成してきた単体のプログラムを合体させて作成。今まで単体で動作を確認してきたので合体してもスムーズに動作しました。

Rubicからのプログラム転送でエラーの頻度が多くなった感じがします。プログラム容量が増えたのが原因か否かはわかりません。

作成したプログラムはつぎのとおりです。

WiFi_Udp

 

 

 

 

 

 

GR-CITRUSとMIKANを試してみる(4)

前回はジャイロセンサモジュールのmrubyで動かすソフトを紹介しました。今回はDCモータ1と2をPWMで動かす基本ソフトを紹介します。

動かす条件は下記のとおりです。

①動作はUSBシリアルでPCからGR-CITRUSにコマンドを送るとそれに合わせてモータ制御モジュールDRV8835をコントロールするものです。

PCから送るコマンドは5種あり

”s”:全モータストップ

”f”:前進(両モータ共前進)

”b”:後退(両モータ共後退)

”l”:左回転(モータ1後退、モータ2前進)

”r”:右回転(モータ1前進、モータ2後退)

TeraTermでコマンドを送った例>

f:id:jf3rgskun:20161125094108j:plain

 

②USBシリアルのボーレートは230400bps

③GR-CITRUSのシリアルSerial4を使用し、TX/RXはそれぞれピン12/11に接続します。

作成したmrubyプログラムはつぎのとおりです。

motor