どどーんはじめました。~その3~

今回のマルチコプターでS.BUSを初めて使ったので信号をArduinoで読み出してみました。
S.BUSとは何かという詳しい説明はコチラ→https://ja.wikipedia.org/wiki/S.BUS
要はラジコン受信機から昔ながらのサーボ信号を出すのではなくシリアル通信にする事で全チャンネルを1本の信号線で制御するという物です。

飛行機の場合はサーボの位置が分散しているので結局それぞれに配線する必要があり、あまりメリットを感じませんでした。しかしマルチコプターでは受信機の信号は全てフライトコントローラ基板に接続するのでこれが一本で済むのは大きなメリットになります。

S.BUS信号はシリアル通信ですが、UARTでよく使う仕様とは微妙に違うところがあり面倒になっています。例えば次のところ・・・

  • ボーレートが100Kbps。
    なぜか115.2Kbpsではなく100Kbpsです。妙なボーレートですがArduinoではSerialBegin()のとき100000と指定する事で対応できます。
  • 信号極性が逆転。
    Arduinoに入れる信号はインバータで反転してやる必要があります(もしかするとArduino側に反転機能があるのかもしれませんが見つけられませんでした)。

あと受信後のデータが11bit区切りなので並べ替えがややこしいです。

S.BUSプロトコルに詳細はこちらを参考にしました。→https://os.mbed.com/users/Digixx/notebook/futaba-s-bus-controlled-by-mbed/http://anarchy.hatenablog.com/entry/2014/12/07/181853

そして最低限の部分をスケッチに書きます。

int count;
long interval;
void setup() {
 Serial.begin(115200); // Terminal
 Serial1.begin(100000,SERIAL_8E2); // S-BUS
 count=0;
}

void loop() {
 int data[26];
 int val[19];
 int i;
 if (Serial1.available() > 0) {
 data[count]=Serial1.read();
 interval=millis();
 count++;
 }
 if ((interval+4 < millis()) && (0 < count) ) {
 count=0;

 val[0] =((data[1] & 0xff)<<0) + ((data[2] & 0x07)<<8);
 val[1] =((data[2] & 0xf8)>>3) + ((data[3] & 0x3f)<<5);
 val[2] =((data[3] & 0xc0)>>6) + ((data[4] & 0xff)<<2) + ((data[5] & 0x01)<<10);
 val[3] =((data[5] & 0xfe)>>1) + ((data[6] & 0x0f)<<7);
 val[4] =((data[6] & 0x0f)>>4) + ((data[7] & 0x7f)<<4);
 val[5] =((data[7] & 0x80)>>7) + ((data[8] & 0xff)<<1) + ((data[9] & 0x03) <<9);
 val[6] =((data[9] & 0x7c)>>2) + ((data[10] & 0x1f)<<6);
 val[7] =((data[10] & 0xe0)>>5) + ((data[11] & 0xff)<<3);

 val[8] =((data[12] & 0xff)<<0) + ((data[13] & 0x07)<<8);
 val[9] =((data[13] & 0xf8)>>3) + ((data[14] & 0x3f)<<5);
 val[10]=((data[14] & 0xc0)>>6) + ((data[15] & 0xff)<<2) + ((data[16] & 0x01)<<10);
 val[11]=((data[16] & 0xfe)>>1) + ((data[17] & 0x0f)<<7);
 val[12]=((data[17] & 0x0f)>>4) + ((data[18] & 0x7f)<<4);
 val[13]=((data[18] & 0x80)>>7) + ((data[19] & 0xff)<<1) + ((data[20] & 0x03) <<9);
 val[14]=((data[20] & 0x7c)>>2) + ((data[21] & 0x1f)<<6);
 val[15]=((data[21] & 0xe0)>>5) + ((data[22] & 0xff)<<3);
 val[16] = (data[23] & 0x1) ? 0x7ff : 0 ;
 val[17] = (data[23] & 0x2) ? 0x7ff : 0 ;
 val[18] = (data[23] & 0x8) ? 0x7ff : 0 ; // Failsafe

 for (i=0 ; i<19; i++ ) {
 Serial.print(val[i],DEC);
 Serial.print(F(" "));
 }
 Serial.print(F("\n"));
 }
}

S.BUSから取り込んだデータをUSB経由でシリアルモニタに表示したいので、シリアルポートが複数あるArduino MEGA2560で動かしてみます。

S.BUSモニタ

Arduino MEGA2560でS.BUSをモニター。
ブレッドボード上のICは信号極性反転のための74HC00。

 

こんな感じでデータが出てきました。
送信機が6CHなので7CH以降が正しいかどうかは確かめられていません。また19番目のデータはFailsafeが働いたときに1になるはずですが、これも確かめていません。

S.BUS monitor

モニター中。

各データが11bitt幅なので0~2047が表せるはずで、どうやらニュートラルが1024の様です。
ところでCleanflightにも受信データを表示する機能があります。しかし今回のモニターとCleanflightの値が一致しません。そこで何ポイントか対応を取ってみました。

 SBUSモニタ Cleanflight
       102         943
       697        1315
      1024        1520 ←ニュートラル
      1435        1776
      1681        1930

グラフにすると・・・

SBUS-CleanFlight

SBUSとCleanFlightの読値対応

恐らくCleanflightの表示値は昔ながらのPWMサーボ信号のパルス幅に換算した値をμS単位で表示しているのだと思います。例えばニュートラルはS.BUSの生データは1024ですがPWMだと1520μSといった感じ。
ということでS.BUSの生の値にざっと0.625掛けて879.5を足すとほぼCleanFlightの値になる様です。

PC不調~その後~

1月にPC不調の件を書きました。
寒くなってから調子が悪くなりヒートガンで温めると立ち上がるという症状。
その後しばらくヒートガンで温めながら使っていました。
そして春になり、 温めなくても立ち上がる様になったと思った矢先、作業中にこんな画面が出てきました。

PCのエラー

これっていわゆるブルースクリンでしょうか?なんか以前のWindowsと雰囲気が違いますが。

最初は再起動すれば何事もなく動作しました。しかし翌日は立ち上げ途中でこの画面が出て先に進みません。今回は温めてもダメです。

とりあえずBIOS設定画面でフェイルセーフ設定にすれば立ち上がります。
で、色々いじったところCPU ClockRatioという設定が元々21Xだったのを20Xに下げると動作する事が分かりました。標準がいくつなのか覚えていませんがとりあえず20Xで使えるのでしばらく使っていたところ、また同様のエラーが出る様になり、あとはエラーが出てはクロックを少しずつ下げる繰り返しでとうとう10Xまで来ました。9Xまでしか下がられないので後がありません。観念してマザー、CPUを更新する事にします。

 で、買ってきたのはこれ。
・CPU:Intel i3 7100
 ・マザー:ASUS PRIME H270-PLUS
 ・メモリ:中古のDDR4 8GB×2枚

もう以前の様に色々調べたりしていません。パソコン工房熊本店に出かけ、今使っているのがこれこれでとりあえず今より遅くならないやつといって提示されたのを買いました。i5からi3になってコアが減るのがなんとなく寂しいですがベンチマーク上は前より上だそうです。当然用途にもよると思いますが。

i3

Intel core i3

mother

ASUS PRIME H270-PLUS

で、交換ですが、今までならこんな場合はOSを再インストールしていました。その際データをバックアップするといってもそんな大容量の媒体もないので結局HDDも更新し、OSインストール完了後に古いHDDを接続してデータを移していました。

しかしこちらのサイトによるとWindows10なら旧HDDをそのままつなげば使えるとの事。やってみたらその通りすんなり立上り、OSの認証もこちらに書かれた方法で完了しました。あっという間です。

・・・という事でまた当面は安心して工作が出来る様になりました。

PC不調

最近メインで使っているPCの調子が悪く、電源投入後一発で立ち上がらない。
正常時は電源投入の数秒後にピッという音が鳴ってOSを読み始めるのだが、このところはピッの段階になる前に電源が落ち、その後10秒くらい経ってから勝手に電源が入る動作を数回繰り返した後にやっと立ち上がる。
最終的には立ち上がるのだが、何度も電源がON/OFFするとマトモなところまで(HDDとか)壊れそうな気がして精神衛生上よろしくない。
どうも寒くなってからこの現象が起きている気がする。

寒い時に立ち上がらないというと電源が怪しい気がする。そこで電源の蓋を開けてみたが、明らかにコンデンサがイカれている様子などは見当たらない。またヒートガンで電源を温めても立ち上がりやすくなる様子はない。

他のあちこちを順番に温めてみたところ、どうもマザーを温めると立ち上がる模様。マザーも目視する限りはコンデンサのパンク等は見えないが、どこか見えないところがイカれているのだろう。

ウチのPCはGIGABYTEのGA-P55-USB3というマザーにインテルi5を載せている(だいぶ前にメモリーチェックを繰り返すとエラーがでる件を書いたけど、結局は未だに使っているのだ)。

いっそマザー+CPUを新しくしようと考えたが結構高い上に、新品で手に入るマザーだとメモリーがほとんどDDR4になっちゃってて、そうするとメモリーも変えないといけない(今使ってるのはDDR3)。
今の構成で特に速度的な不満はないので中古マザーをネットで買おうかとも考えたが、それも何だかねえ。

という事で毎回ヒートガンで温めながら立ち上げてます。春まで耐えれば喉元過ぎて、また数カ月はそのまま使うのかも。

64bitWindowsでOpenStickへの書込みができなかった件

MakerFaire用に新たなデバイスを作っていたらOpenStickへの書き込みが出来なくなっている事に気づきました。 まずいです。 このままではMakerFaireで胸を張って照会できません。
先日Windows7(32bit)からWindow10(64bit)に変更した事が絡んでいる様です。

OpenStickへの書き込みはMybootOSというツールで行うのですが、これが下の様なエラーになって立ち上がりません。

MybootOS_Error

間違ったフォーマットのプログラムを読み込もうとしました。(HRESULT からの例外 0x8007000B) ・・・というエラーが出る。

MybootOSはC#で書いてありVisualStudio2010でビルドしています。
ググってみると、どうやらビルドする時のCPUの指定がAnyCPUになっていたのが原因だった様です。 AnyCPUってのは実行するOSが32bitでも64bitでも、それぞれに合わせたモードで動いてくれるものだそうです。ところがプログラム内からDLLを読んでいると、DLLが32bitか64bitかというところまでは面倒を見てくれないため、今回の場合アプリケーションは64biitで動作しているのにDLLが32bitだったのでエラーになっていました(Mybootではmpusbapi.dllを使っています)。
そこでVisualStudioでX86としてビルドし直すと32bitのアプリが生成され、これだと最初から32bitとして実行するので無事動作する様になりました。

という事で64bitのOS上で動かす時は32bit版のアプリを実行しなければならないという解り難い状況になっています。
いずれにせよ動作する様になったのでバイナリだけアップしておきます(ソースは変更していないので)。 

で、そもそも何を作っていたのかというと、これです。。。

ヨットシミュレータコントローラMINI

ヨットシミュレータコントローラMINI

今回MakerFaireには実物大コントローラは持って行かないので雰囲気だけでもヨットっぽいコントローラをつくってみました。

Windows10(64bit)版でヨットシミュレータが動作しない件

Windows10への無償アップグレードが7月29日までという事なので、そろそろ検討を始めようと思い、まずはセカンドマシンで試してみました。
セカンドマシンとはHPのEliteBook2740pです。昨年の山口ミニメイカーフェアヨットシミュレータを動かすマシンが無かったため、中古で購入しました。セカンドマシンとはいえIntel i7搭載なので、メイン(Intel i5)より高級です。

HP Elite2740p

分厚いですがタッチパネルなのでWindows10を試すには最適です。

これには元々Windows7(32bit)が入っています。このマシンにはリカバリディスクが付いていないのでHPから購入しました。その際、32bitでも64bitでも購入可能との事でしたので64bit版を買っています。 よって今回は元々のWindows7(32bit)から、一旦リカバリディスクによりWindow7(64bit)を入れた後、無償アップグレードにてWindows10(64bit)化します。

まずリカバリディスクによりWindows7(64bit)をインストールした時点でヨットシミュレータを起動してみました。しかし何やらエラーが出ています。が、とりあえず今回はWindows10にしてから悩む事にします。

で、途中いろいろあったのですが、話はWindows10(64bit)インストール後に進みます。この状態でヨットシミュレータを実行してみるとやはり下の様なエラーが出て起動できません。

MSVCR100.dllがないため、プログラムを開始できません.

なにやらエラーが発生。

MSVCP100.dllが無いそうです。「OK」を押すとMSVCR100.dllも無いと言ってきました。検索してみると「MICROSOFT  VISUAL C++2010 再頒布可能パッケージ」を入れろとの事です。確かにヨットシミュレータはVISUAL C++2010でコンパイルしています。

ところで「MICROSOFT  VISUAL C++2010 再頒布可能パッケージ」には32bit版と64bit版があります。今回OSは64bitになったので64bit版をインストールしました。
しかしこれでは変化ありませんでした。なぜでしょう?
ヨットシミュレータは32bitアプリとしてビルドしてあります。結局アプリが32bitならOSが64bitでも32bit版パッケージを入れるのが正解な様です。

<参考>MICROSOFT  VISUAL C++2010 再頒布可能パッケージのダウンロード先

 

IchigoJamでHIT&BLOW

ブームに乗ってIchigoJamを買ってみた。

「こどもパソコン」というキャッチフレーズのIchigoJam
しかしこどもに渡さずオッサンが楽しんでいるのだ。

キットは下の写真の内容である。

IchigoJam1

IchigoJam キット

 

組み立てるとこんな感じ。電源をモバイルバッテリで供給しポータブルDVDプレーヤに出力したのでモバイルパソコンとなった。

IchigoJam2

IchigoJam 動作風景

しかし小さい画面ではやりにくいのでプログラミングの際はPCとシリアル接続することにした。これならいつものPCでTeraTermから入力できてやりやすい。

と言う訳で、久々のBASICなので懐かしいHIT&BLOWを作ってみた。
昔のマイコンゲームと言えばまずこれだろう。
若者は知らないかもしれないのでルールを書くとだいたい次の通り。

  1. コンピュータが4桁の(各桁の数字が重複しない)数値をランダムに生成する。
    これは現時点では表示されない。
  2. そしてプロンプトが出てきて人間がこれと思う4桁の数値を入力して当てていく。
  3. 数値を入力すると、コンピュータから次のヒントがでる。
    ・桁も数値も一致する事をHITと呼び、この数を表示する。
    ・桁は違うが数値が一致する事をBLOWと呼び、この数も表示する。
  4. たとえばコンピュータが用意した数値が1234だとして人間が1426と入力すると、HIT=1,BLOW=2というヒントが表示される。
  5. 要は入力した値に応じてHITとBLOWが表示され、このヒントを元に正解を推測していく。いかに少ない回数で当てるかを競うゲームなのだ。

なおIchigoJamに入っていたファームウェアバージョンは0.9.7で、このバージョンだとFOR文が使えずエラーとなるのでIFとGOTOでループを作った(さすがに大昔使ったTK-80BSでもFORは使えたが・・・)。 でも最新ファームならFORも可能だそうです。

リスト:

1 REM *** HIT & BLOW ***
5 I=0
10 IF I>3 THEN GOTO 70
20 [I]=RND(10)
29 J=0
30 if J>=I THEN GOTO 60
40 IF [J]=[I] THEN GOTO 20
50 J=J+1: GOTO 30
60 I=I+1: GOTO 10
70 REM print ">>>",[0],[1],[2],[3]
100 INPUT ">>>",A
110 [10]=A/1000
120 [11]=(A%1000)/100
130 [12]=(A%100)/10
140 [13]=A%10
150 REM print [10],[11],[12],[13]
200 H=0:B=0:
209 I=0
210 IF I>3 THEN GOTO 240
220 IF [I]=[I+10] THEN H=H+1
230 I=I+1: GOTO 210
240 IF H=4 THEN GOTO 1000
300 I=0
310 IF I>3 THEN GOTO 370
320 J=10
330 IF J>13 THEN GOTO 360
340 IF [I]=[J] THEN B=B+1
350 J=J+1: GOTO 330
360 I=I+1: GOTO 310
370 B=B-H
380 PRINT "HIT:",H,"BLOW",B
400 GOTO 100
1000 print "ANSWER>",[0],[1],[2],[3]

タック練習ソフト」

先日タック練習機を作った話を書いた。
なぜか私も一緒に練習しているのだが、何度もタックを行っていると、何回やったかが分らなくなる。そこでタック練習用ソフトを作成してみた。

タッック練習ソフト

タッック練習ソフト

特にまあ何と言う事もないのだが、スタートボタンを押すと最初のみホイッスルの短音が8回鳴り、その後5~10秒おき(ランダム)に長音一回+短音一回が鳴ってカウントアップする。このタイミングでタックをするのだ。 簡単なソフトだがホイッスルの音が気分を盛り上げてくれる。
ホイッスルの音はSoundEngineで録音してDOT8.wavとN.wavという名前で保存してあるので、このファイルを書き換えれば音を変える事ができる。


もしかすると役立つ人がおられるかもしれないので、一応アップしときます。

実行するには.NetFreamework4がインストールされている必要があります。
ビルドはVisualC# 2010 Expressで行いました。

 

RepRap組立て開始

RepRap Prusa Mendel の組立てを開始した。

RepRap組立て1

まだ、これだけ・・・

話は変わるが、昨日も書いた不調のPC、メモリーだけ買ってきて交換してみた。その後、最初は調子良かったが、何度かBIOS設定を変えながらメモリーチェックをやっているとNGが出た。でもその後は出ない。 これはやっぱりマザーか?
CPUはIntel i5-750なのだが、色々調べていると、この頃からメモリーコントローラはCPUに内蔵されたそうな。。。 ってことは、CPUの可能性もあるってこと? とりあえず、また暫く様子を見ながら使ってみることにした。