raspberrypiのネットワークが立ち上がらなくなってしまっていた。差し当たって必要ないのでほっておいたが、今日、いろいろ調べてみた。
結局、raspi-confgで、network Configure をdhcpcdから、networkmanagerに変更したら立ち上がるようになった。理由は、わからない。
raspberrypiのネットワークが立ち上がらなくなってしまっていた。差し当たって必要ないのでほっておいたが、今日、いろいろ調べてみた。
結局、raspi-confgで、network Configure をdhcpcdから、networkmanagerに変更したら立ち上がるようになった。理由は、わからない。
前日の終了の仕方が悪かったのか、raspberrypi が起動しなくなった。You are in emergency mode・・・・・・を限りない感じで繰り返している。
https://www.jh4vaj.com/archives/26989
このサイトを参考にした。
WindowsにいれたVirtualboxのraspberryで問題のSDカードを認識させて上記サイトの最後の方にある、e2fsckをbootではなくファイルシステムの方に実行した。全てyesで、終了させる。再度起動させたら、正常起動した。ほっと胸を撫で下ろした。
先にも書いたが、ドローン2号機上のコントローラーはラズパイ4で、それとのやりとりをもともとWIFI経由で予定していたが、機体がアルミパイプであるために通信が不安定で使い物にならなかった。そこで、プロポに変えた。プロポの信号取り出しもなんとか安定できるようになったが、そのシステムを最初、ディスプレイとかマウス、キーボードを繋いだ形で起動しなければならず、一旦動かしたのちにログの処理をするなどの場合に、再度繋ぎ直す必要があるなど、耐え難い不便があった。
そこで、無全モジュールを使ってコントローラーを動かすことを考えた。機体の制御はプロポを使うのだが、その他のシステム制御を担うべきものだ。
無線モジュールとして、TY92SS-E2730が秋月電子に二千数百円で売っていたので、それを使うことにした。920MHzで400メートル以上とどく。技適取得済みで免許は要らないことにも驚きだ。正々堂々と使える。
これは、XBeeモジュール用のUSBインターフェイス基盤(秋月電子、千数百円)と組み合わせて使うことが圧倒的に便利であることが色々試みた結果、事後的に分かった。そもそも、XBeeがなんであるかはよく知らないのだが、知らなくても使えることがいい。
多数のモジュールをネットワーク上に繋いだりもできるようだが、差し当たっては、1対1の通信ができれば良い。
それぞれを相互の送受信用に、二つずつ買って、コネクタを半田付けして組み立てた。ピン配列の向きに注意しないと、基盤を壊す可能性がある。
2号機のテスト飛行を、近所の農家のSさんの畑を借りて実行した。
Sさんには、日頃からいろいろお世話なってい流。私が下ケ傍示から二之袋の竹の人がやっている早朝のラジを体操に向かうとき、いつも散歩しているSさん夫婦に出会う。中の良い姿を見るのに癒される。また、私の二之袋にある畑用に、玉ねぎの苗を200本以上もらったりもした。そのSさんが、私のドローンのテスト飛行用に、下ケ傍示ベースと二之袋ベースの間にある、絶好の場所を提供していただいたのだった。
テスト飛行の様子はyoutubeにアップしたので、以下から見ていただきたい。
結果的に墜落状態になったが、過去のテストと比べて、より高い位置で空中遊泳をした飛行になった。
色々な課題が浮かび上がったテスト飛行だったが、いつものように、まず、ログの分析を与えておこう。
機体のロール方向とピッチ方向の傾き、それに対応したモータースピード(実際の回転ではなく、モーターに加えた電圧レベルと考えたら良い)のデータは次のようになる。
図をクリックすれば拡大されるのでそれを見ていただきたい。上部のオレンジと青の線は、ロールとピッチ方向の傾きだ。揺れがずれながら(期待が渦巻き状態になり)拡大している。最後は破綻している。(縦のスパイク状の変化は、システムが発生する誤差であり、無視して良い)これまでの記事にあるように、プロポからのPWM信号を変換するのに、ローパスフィルターを使っていたが、値が不正確で、モーターの回転のばらつきが発生して、飛行失敗につながっていることがわかった。
そこで、この方法は諦めて、ラズパイのGPIOの立ち上がり、たち下がりを検知するCALLBACK関数を用いて変換することにした。そのために、pigpioというライブラリを使用する。詳細はまた、この記事に書こうと思う。
(1)インストール
https://abyz.me.uk/rpi/pigpio/download.html
最新バージョンのダウンロードとインストールはここに書いてあるとおりにすればいい。
(2)C++で実行するときは、作成したプログラムをsudoを使ってroot権限で実行する必要がある。その代わり、pigpiodを事前に起動する必要はない。
(3)受信機の接続
受信機からの信号を空いている GPIOピンに接続。
(4)プログラム
8ちゃんねるの信号を読みとっとμ秒単位のPWMの幅で出力するプログラムの概要は以下のような感じである。CALLBACK関数は、グローバルな場所に置いておかなければならない。それに伴い、変数もStaticである。
コンパイル時のライブラリに pipgioとpthreadを追加しなければならない。
#include <stdio.h>#include <pigpio.h> static int pwm_count[8]; static uint32_t rise_tick[8]; static int pwm_width[8]; unsigned int from_gpio[30]; void interruptDisplay( int gpio, int level, uint32_t tick) { int array_No = from_gpio[gpio]; if(level==1){ rise_tick[array_No] = tick; }else if(level==0){ int diff = tick - rise_tick[array_No]; if(diff > 500 && diff < 2500){ pwm_width[array_No] = tick - rise_tick[array_No]; //printf("Interrupt pin %d #%d level %d at %u DIFF = %d\n", gpio, c, level, tick, pwm_width); printf("%d,%d,%d,%d,%d,%d,%d,%d,%d,%d\n", gpio,pwm_count[array_No] , pwm_width[0] , pwm_width[1] , pwm_width[2] , pwm_width[3] , pwm_width[4] , pwm_width[5] , pwm_width[6] , pwm_width[7] ); pwm_count[gpio]++; } }else{ printf("ERROR level is non 0 and non 1\n"); } } int main(void) { int ret; // 配列番号をGPIO番号に unsigned int to_gpio[8]; to_gpio[0] = 4; to_gpio[1] = 17; to_gpio[2] = 27; to_gpio[3] = 22; to_gpio[4] = 5; to_gpio[5] = 6; to_gpio[6] = 13; to_gpio[7] = 26; // GPIO番号を配列番号に from_gpio[4] = 0; from_gpio[17] = 1; from_gpio[27] = 2; from_gpio[22] = 3; from_gpio[5] = 4; from_gpio[6] = 5; from_gpio[13] = 6; from_gpio[26] = 7; if (gpioInitialise()<0) return 1; for(int i=0;i<8;i++){ pwm_count[i] = 0; rise_tick[i] = 0; pwm_width[i] = 0; /* Set GPIO modes */ gpioSetMode(to_gpio[i], PI_INPUT); gpioSetPullUpDown(to_gpio[i], PI_PUD_UP); printf("GPIO %d is level %d\n",to_gpio[i], gpioRead(to_gpio[i])); ret = gpioSetISRFunc(to_gpio[i], EITHER_EDGE, 5000, interruptDisplay); // Callback 設定 if(ret < 0) printf("error GPIO Int %d\n",to_gpio[i]); } while (1) { time_sleep(60); } gpioTerminate(); }
(5)プロポに反応した結果
実行はルート権限で行う必要がある。
先の分析で示したPID制御信号について、D制御のギザギザがあるという話をした。それでも、P制御よりも先行した制御信号になっているはずだと書いた。その辺りを確かめてみよう。
以下の図は、PID信号をそれぞれに分解したものだ。
D信号は、Roll データの細かい信号を拾ってギザギザになっているが、平均すればP信号よりも先行する制御信号を出していることがわかる。すなわち、いわば、SINカーブに対して微分したCOSカーブである。システムで、dshot信号を作るのをpicoでやらせていた。UARTの使用の関係で、pico1台で、2つのモータに信号を送っていたので、2つのpicoを使っていた。それまでは、pico二信号を送って、あなたはどちらのpicoですかと問い合わせして、その答えを聞いて /dev/t...