Arduino初心者熱烈大歓迎質問スレ part27
■ このスレッドは過去ログ倉庫に格納されています
https://rio2016.5ch.net/test/read.cgi/denki/1579146318/999
>割込処理内ではフラグだけ立ててメインループでポーリングしてフラグ監視するのは基本じゃね
実にユニークなタイマー割込みの使い方ですねw >>3
同意
だったら初めからメインでポーリングでmillis監視しとけって話
そもそもモーター止めるだけなんだから割込みルーチン内でやっちまえばいい
いずれにしても2重に監視する意味が不明 >>1
スレ立て乙!
>>2
ホントだ!
UNOとブレボがあって、Lチカしてる? >>3
激しく同意w
二つの問題がある。
1. 「割込み処理内でフラグをセットして、
バックグランドでそれをポーリングして検出したら処理を始める」
というのは、割込みルーチンの中で処理すれば不用なことなのに、
プログラムをムダに複雑にするだけです。
2. ポーリングループのフラグ検出タイミングによっては、処理が始まる時間にバラツキが生まれる。
これは重大な問題を生じる可能性がある。
以前にある会社から
「パルスモータで位置制御をやっているのだが、停止位置が微妙にズレる時がある」
と相談された。
調べたら、
原点センサを検出したら位置情報をクリアしているのだが、
割込みでフラグをセットして、メインでポーリングでフラグをチェックしている。
ポーリングループの命令実行タイミングによっては、
1パルス分だけモータが進んで検出する場合があり、
結果として停止位置のバラつきとなって表面化している。
プログラムが大きくて複雑になると、ポーリングの時間間隔が長くなり、
この割込みフラグの検出タイミングのバラツキも大きくなる。
常に同じ遅れ時間なら(遅くてもバラツキが無いなら)、このズレの影響はまだ少ないのだが・・・
標語にもあるでしょ? 「今日できることを明日に延ばすな」ってw (1/3)
前スレでAT-09のペアリングがうまく行かないって言っていた者だけど
結論から言うと、ペアリングはできた(android、PC(BTドングル)、新Fireタブ7)
開発環境はlinux(ubuntu系)
AT-09はパチもんらしいのでそのままだと使えるATコマンドが限られていて
ペアリングできないっぽい?
なのでAT-09のfirmwareをhm10のやつに書き換えて
AT-TYPEを3へ変更すればペアリング可能になる
HM-10より100円くらい安く買えてHM-10として使えるのでお得?なのかもしれない
つづく (2/3)
具体的には
https://blog.raquenaengineering.com/arduino-and-the-myo-armband/
ここの[2]: Flashing the Modules.からそのままやったらファームウェアの更新ができた
(このサイトを【サイトA】とする)
いるもの(実際に使ったもの)
AT-09
https://s.click.aliexpress.com/e/_dSMl8cq
Arduino UNO
https://s.click.aliexpress.com/e/_dV2crlc
CCLoader.ino
https://github.com/RedBearLab/CCLoader/blob/master/Arduino/CCLoader/CCLoader.ino
CCLoader
https://github.com/RedBearLab/CCLoader
ざっくり流れ
(1)CCLoader.inoをUNOに書き込む
(2)UNOとAT-09(CC2541チップ)を各ハンダ付けして配線する
(リセットのとこに10μFのコンデンサ云々は無視、
AT-09のdip端子のVCCから供給すると3.3vにしてくれるっぽいので?
UNOからは5vで出力のみで一番シンプルな配線でやった)
https://i.imgur.com/AEyPmKw.jpg
(この辺はもっとちゃんとやった方が良いかもしれない)
(3)/CCLoader-master/SourceCode/Linux/main.c をコンパイル
$ gcc main.c -o ccloader
(main.cと同ディレクトリにccloaderファイルが作られる)
(4)(2)の状態でUNO電源ON
(5)(3)のccloaderファイルを実行
$ ./ccloader 【USBのポート】 【binのパス】0
つづく (3/3)
ハマったところ
(2)←ハンダ付けするところが小さすぎてハンダ付け初心者には酷。
これ参考にした https://youtu.be/ez3491-v8Og?t=191
(5)←最初、Baud:115200 data:8うんたらかんたらでてきて進まなかった
原因は、binファイルの指定ミス
/CCLoader-master/のbinディレクトリにCC2541hm10v540.binみたいなのが入ってるので
確実にそのパスを指定する
(5)←Baud:115200云々以降に進めたが、今度は
Request sent already! Waiting for respond...
で止まってしまう。 ← 【サイトA】の通りで解決
Ctrl+Cで停止→<DEVICE_NUMBER>を1にして実行→Ctrl+Cで停止→0で再実行
(なぜこれで解決できるのかはわからないが)数字の羅列が出てきて
CC2541への書き込みに進めた
(注)更新後、AT-09からIDEのシリアルモニターでのATコマンドの扱いは
[CRおよびLF] → [改行なし]へ。 ATコマンドも"AT+NAME?"みたいに"?"をつけないとスルーされる
binファイルは最新のもあるみたいだが、複数試したがv540でのみ成功した
あとv540は、AT-09に給電してもLEDが常に消えた状態っぽい あと言い忘れてた
※AT-09は非技適なので適所での使用で。 すまん訂正
>>11
>AT-TYPEを3へ変更
これは間違いか合っているか定かではない
ファームウェアのアップデート後はおそらくTYPE0なので
そのままでいけるかもしれない
さっきAT+TYPE3でやったらペアリング無理で、
AT+TYPE0でやったらいけた あとCC2541hm10v540.binの初期パスワード(AT+PASS)は000000
更新後すぐに適当なBL接続できる.inoにスケッチして
BL端末でそのパス通せばペアリングできた
以上、連投すまん >>8
通常そういう装置ってロータリーエンコーダーがモーター軸か機械軸に取り付けてあるんじゃないの?
原点復帰する時に原点センサー検出した後の
ロータリーエンコーダーのZ相検出を原点にするから
毎回位置ずれなんておきないように装置設計するはずだし
そもそもモーションコントローラーにコマンド投げるだけで勝手に動作するから
メインのCPUに割込使うこともないはずだが そもそも990はモーターからの続きなの?
全般の話じゃないの? >>953
メイン
・lcdtime>30 で表示処理
・表示終わったらlcdtime=0
通信など
ループ
割り込み 0.1秒
・lcdtime++
・モーター作動ならmotertime++
・motertime>300 ならモーター停止
・モーター作動処理
俺様が答え書いてんのに
肝心のモーター作動処理をメインに持ってくとは何て頭が悪いんだ
メインループが止まったりもたつくから問題なんであって
そこに処理させたら遅延して当たり前 横からですみません
割り込みではフラグ立てるだけのほうが良い場合ってある? 良い場合も何もそこから派生する処理があるならそれ以外有り得ないだろ >>21
排他処理が必要な場合、メインで一括して書くほうがデバッグが楽だったりする。
リエントラントでない処理とか、メモリ割り当てが制限されるとか、割込み内でできない
ことはいろいろある。 方針として、出来るだけメインで処理を記述するが、
どうしてもだめなものだけ割り込み内でやる、もしくはタスクを分ける。 なんでそう頭固いんだお前ら?
FM音源チップを使ってゲームのBGM流すのは、全部割り込み処理内でやってんだぞ
フラグ立て限定でもなんでもない
要はメインの邪魔せず、かつ割り込みの時間内できっちり仕事こなす前提で作ればなんだってやれる それは常駐ドライバの形でメインのプログラムとは完全に別個の物だった奴の話じゃないの >>ID:5elxxVd9
ブログにでも書いてリンク張れよ、自分の非常識にすら気づけないのか >>8
>>4が3行でまとめてることを20行以上に膨らませて書き
うちほとんどが昔話で占められるバカ >>21
不定期に発生するような外部割込みで
割込み発生後にする処理よりメインでの処理の方が優先される場合があるとき
今回の話の発端のように30秒後にモーターを止めるとか瞬時に済む処理なら
フラグ立ててる間にモーター止められるのでフラグなんて無意味
まあ、それでもケースバイケースだけど、質問主は最後までフロー示さなかったから何とも言えない >>20
あんたのは割込みを使う意味があまり無い
それならmillisの値を取っといて比較するだけでいい >>9
明石家さんまが「話にはオチが必要やろ」と言ってたのでw
というのは冗談だけど、単に電電板の殺伐とした雰囲気を和ませたいだけですよ。
>>18
パルスモータは原点検出後に移動距離分のパルス数を送れば位置決めできます。
脱調しないように、送り出すパルスレートの制御(加速、定速、減速)は必要ですが、
移動距離情報のロータリエンコーダからのフィードバックは不用です。
>>28
バカですみません。
あなたのようなバカでも分るように書いたら長くなりました。
私は御指摘の通り確かにバカです、カミサンからもよく「バカ」って言われます。
彼女を作って「イヤン、バカン」とか言われてみたいなw >>30
> 割込み発生後にする処理よりメインでの処理の方が優先される場合があるとき
状況を想像してみた。
たとえばメインでワードデータを命令2個で加算し、割込み処理でも同じワードデータを命令2個で加算する時、
メインで加算している時は割込み処理での加算は出来ない。
んー、これはメインの加算の前後で、単に割り込み禁止・許可すれば済む話か。
もっと複雑な処理かな? >>33
なんだステッピングモーターを使ったおもちゃレベルの話か
俺は産業用のサーボでのことを考えてたわ Arduinoのスレしかも初心者スレで産業用サーボの話するバカ >>36
ずぶですが
非常に勉強になるので邪魔しないで下さい >>30
本人が割り込み中ループ止まる事を気にしてたから何かあるんだろ >>35
パルスモータをおもちゃと言い切ってしまう産業用機械の事を知らないズブの素人w
素人で何も知らないら口出ししない方が話が進む。 >>23
>>30
一概には言えないってことか
丁寧に教えてくれてありがとう >>8
>原点センサを検出したら位置情報をクリアしているのだが、
>割込みでフラグをセットして、メインでポーリングでフラグをチェックしている。
フラグ要らねえ
位置情報クリアくらい割込みルーチンで即座にやればいいこと
いちいちポーリングして他を回してるからそうなる
プログラマが頭悪いとそうなる >>41
何でもかんでもメインに詰め込んでポーリングでまわしてやらせるのが趣味で
時々気が向いてタイマー割込み使ったとしてもそのメリットを全く活かせてない
こういう人が若干1名マイコン系スレを徘徊してるよな
少しは学習すればいいのに >>42
その人もともとポーリングしかできなかったんだけど
自慢げにそれをマルチ何だかだとか言って吹聴して歩いて散々笑われ
そのときに割込み使えよバカって言われて初めて割込みってものを知ったんだぜ
でも学習能力無いから割込みルーチンでフラグ立てて結局ポーリングで使ってんの
笑っちゃうね >>32
お前も相当バカだな
millis比較するタイミングが適切に来なかったらどうなる?
30秒で止めなきゃいけないのに30.5秒だったら、オーバーだ
運転士だったら日勤教育で自殺案件だ >.45
は?
millsでは見落とすけどポーリングでフラグをチェックするときには見落とさないのかよ
論点ずれてるぞ、馬鹿すぎw >>46
何言ってんだ間抜け
割り込み内で完了してるものを何故わざわざポーリングでフラグチェックする必要あるんだね?
割り込みの原理もなにも理解してねーようだな >>48
は、何で俺?
>>8や>>20に言ってね。 arduinoってSD.h使ってのSDカードへデータ書き込みする場合、512Bbyteごとにキャッシュを更新してるらしいが
このバッファサイズを変更したいと思っています。
SD.hの中身から辿って行って、512Byteを指定している箇所を見つけたんだけど、その数値を変える以外に方法ありませんか。 >>ID:N7wzj8zK
お前も相当バカだな
何言ってんだ間抜け
基地外でした
毎度のことながら、いろんなヤツがいるわw >>50
それセクター書き込みのバッファじゃね
大きくするならいいけど小さくすると不幸になるよ >>55
キャッシュじゃないんですか。その辺はよくわかっていない・・・
取得したデータをSDに書き込んでるんだけど、その周期を一定にしたいのに512Byteごとにタイミングがずれるのをなんとかしたいのです。
大きくしても結局はタイミングずれるしバッファ大きくなるずれが大きくなるので、いっそのこと毎回データを取るたびに書き込めばいいかと思った次第です。
flushは時間かかりすぎるので使いたくないです。 デュアルコアのarduinoじゃないなら2台使えばいいんじゃね >>56
詳しくないけど、フラッシュメモリの書き込みはセクター単位で、バッファ無しで1バイト
ずつ512byte書き込もうとすると、同じセクターを512回書き替える事になるんじゃないかな ファイルサイズは大きくなるけれど、毎回のデータに512バイトになるように
ダミーデータを付加するのはどうでしょ。 >>58
実際には1バイトずつじゃなくてデータ長ごとに書き込みたいんだけど
それができるメソッドは公式にあるのだろうかという疑問でした。
データ取得の度にflushを使うとその都度10msかかるのでそれは避けたいけど、似たようなことをしたいのです。 よくわからないのだけど、たとえば50m秒ごとに128バイトのデータを受けるとして、
あるときは直後にSDへの書き込みがあり、あるときは、150m秒後のデータ受け取りまで
書き込みが待たされることが問題なのでしょうか。
記録を終了する時点で、フラッシュするなら問題はなさそうだけど。
それとも、いきなり電源を落としたような場合に、どこまでが保全できているかが問題? >>62
簡単に説明すると、
数msごとに数十バイトのデータ取得を行っています。取得データにはデータ取得の時間(起動からの時間)も含まれます。
取得データをSDカードに書き込んでいるのですが、書き込まれたデータを見ると、
基本は一定時間ごとにデータが取得できていますが、10数回に一回程度その時間が約3倍程度に伸びています。
その原因がセクタ書き込み?によるものと推測しています。
この3倍程度になる時間をなくしたい or 極力短くしたいというのが狙いです。
>いきなり電源を落としたような場合に、どこまでが保全できているかが問題?
flushは一通りデータ取得した後に行うので問題ありません。途中で電源落ちた場合にデータが保存されない点は今回は不問です。 >>63
データの取得はタイマー割り込みでやってて、取得したデータは取得時間と一緒に
FIFOに入れてるのでしょうか。
ファイルシステムがビジーの間に、データを取りこぼしているような気がします。 >>63
自分も興味あったんで検索してみたけどもうここは見た?
https://arduino.stackexchange.com/questions/28540/how-to-increase-sd-card-write-speed-in-arduino
ざっくりとSDFat library使えって話と自前のバッファ用意しろって話の2つのようだが
まあほんとに速度が必要なら自分ならFATシステム使わずに直で書くかな
そもそもArduinohaは使わないかも ありがとうございます。参考にさせてもらいます。
自分も腰据えてやるなら、別のマイコン基板使う方がいいなと思ってます。 Arduinoを使うのを前提にするとしても
速度求めるならFATなんて使わない方が良さそうだけど
そういうライブラリは無いのかねえ SdFat使ってみましたが、多少改善されましたが劇的な変化はなかったです。
Write関数でバッファとサイズ指定した場合でも 途中で書き込んでしまった、、、
Write関数でバッファとサイズ指定した場合でも、結局セクタ毎に遅延は発生しますかね。
一応試してみますがあまり期待はできないかな。 >>70
FATでファイルを開いたままにしといてどんどん書き込んでるんでしょ?
バッファが小さけりゃ小さいほど遅延も少ないのでは?
バッファサイズを色々変えて試してみましたか?
どういうスケッチになってますか? >>71
もちろんバッファを小さくして、都度データをSDカードに転送できれば良いのですが、その方法を探していました。
で、色々調べてたんですが、そもそもやろうとしていることがSDカードのHardwareとしての仕様から無理っぽいとわかりました。
512Byteごとにデータを送るのは必須なので、データ取得タイミングを一定にする目的を達成するには、
1. データ取得の都度、データ量が512Byteになるようダミーデータを追加する
2. SDカードへのデータ転送速度を一度のデータ取得時間に比べて無視できるほど十分に小さくする
という方法しかなさそうです。
1は、一回あたりのデータ取得時間が現状よりも長くなる、2は現状の基板を変更する必要がある
ということで、今後どうするか考えます。
長々とお付き合い頂きありがとうございました。 >>72
ちょっと何言ってるのか分からないな
>512Byteごとにデータを送るのは必須
は?それ誰の都合? データ取得と書き込み処理を分けて暇なときに書き込むようにすれば? >>73
え、違うのか?と思ったけど、確かにflush使えばバイト数関係なかった。
>>74
基本、暇なときがないわけですが、それでも現状なるべくそうなるようにしています。
データ取得するにあたってセンサにコマンド送ってセンサがデータ取得するのを待つ必要があるんですが、その間に書き込みを行ってます。
その時間が極めて短いので、512Byteごとにデータ転送による待ち時間が出現してしまうんですが。
512Byteのデータをまとめて送る必要がないならそれも可能ですが、その方法がわかんねーっす(flush除く)。 そんなクリティカルな問題なら、Pro miniか何かもう一つ繋げてシリアルで
データ送ってそっちで書き込めば 割り込みを使ってない、ということは
・時間待ち
・データ取り
・ファイル書き込み
のループなのですよね。
ということは、
[期待するループ時間]<[ファイル書き込み遅延時間]
が発生したら、問題のような現象は必ずおきるし。
SDへの書き込みがセクタ単位ってことは、書き込みのタイミングによっては、
ファイルアロケーションテーブル(FAT)への書き込みも連鎖的に発生するし、キャッシュが
小さければ、いったんFATのセクタ読み出しも行ってから書き込みを行うことになるはず。
おまけに、次のクラスタに移るときは、空きクラスタを検索する場合もあるかもしれない。
マイコンのスピードを上げても、ファイル書き込みは時間がかかることはある。
データ取りは割り込みで処理して、FIFOに入れていかないと。 >>80
>データ取りは割り込みで処理して、FIFOに入れていかないと。
で、それいつ処理すんのさw
書き込み時間>データ取得間隔
である以上、どんな方法でも絶対に実現できないよね
割込みとかFIFOとか何の話やら >>81
>書き込み時間>データ取得間隔
>である以上、どんな方法でも絶対に実現できないよね
(データ取得がSDと共通のSPIを使ってると話が違ってくるだろうけど)
>>63を見てもわかると思いますが、
書き込み時間が常にデータ取得間隔より長いわけじゃありません。
たとえば、
・データは5m秒に1回取り込む必要がある。
・ほとんどの書き込み処理時間は1m秒で完了する(実際のSDへの書き込みは実施されない)
・9回に1回、書き込み処理時間が20m秒程度かかる(実際のSDへの書き込みが実施される)
ということなら、
・10回にデータ取り込みで経過する時間が50m秒
・10回のデータ書き込みに29m秒
なので、処理時間の計算は成立するよね。
必要なのは書き込み時間が長いときでも、
・こぼさずにデータを取得すること
・そのデータを一時的にバッファリングするFIFOを設けること >>81が正しいと思います。
誤解を招いたかもしれませんが、センサーのデータ取得には、センサーへのデータ取得命令とセンサーからマイコンへのデータ転送命令を行う必要があります。
一連のループは、
@N+1回目のデータ取得命令(センサにデータ保存)
ASDカードへN回目のデータをSDへ記録
BN+1回目のデータ転送命令(マイコンにデータ保存)
の繰り返しです。@でセンサ側で数msかかるのでその間にAとBを行ってます。Aが長くなるとBが遅れます。
データの取りこぼしうんぬんは割り込み使う場合の話ですかね。上記を順次おこなっているので、データの取りこぼしはありません。
FIFOは関係ありますか。現状もデータはバッファに書き込んでます。バッファが512バイトになるとSD書き込みで時間がかかるという認識です。
上にあるように、マルチコアでSDへのデータ転送を別のコアが担当する以外の方法だと、多かれ少なかれ時間がかかってしまうと思います。 >>82
すみません、言いたいことが理解出来ました。
SDカードへのデータ転送中でもデータ取得のタイミングで割り込み入れて、バッファにデータを溜めこむという事ですね。
それが出来るか謎なのと、大幅なコード変更が必要で時間かかりそうですが、試してみます。 もしかして簡易的な人工呼吸器ってarduinoで作れたりしますか? 医学は実験だし、余裕で作れるよ。
しかし結局はそれを自分に使ってほしいと人々が思うかどうかですね。
医学に対する人々の信頼があまりに崩れると文明そのものが崩壊しかねないので無茶は出来ない。お前もイヤだろ?
しかし医療崩壊が起きてギリギリの線でお前が死にかけている所で、Arduinoが最後の望みだ!という場合ならお前も喜んで使ってほしいと思うかもしれない。
状況によりますな。 ぐぐったらすでにオープンソースであるみたいですね。。
https://github.com/jcl5m1/ventilator
>Arduino Compatible Nano/Clone
Nanoのクローンでもいけるっぽい マイコンなんかより人工呼吸器の他のパーツを準備する方が遥かに面倒だと思うんだけど、なぜArduinoで作れるのかという発想になるのかが不思議 それは「俺の方が考えが上を行っている」という単なるマウント取りでしょ。 >>82
ライブラリをちゃんと見てないんだけど、SDに書き込み中に割込み処理は可能なの?
SPIのクロックにタイマー使ってたりしてない? あ、ごめん、>>84が試すだろうからそっちを待ってるわ。 割り込み試しました。
結論としては、割り込みで一定時間ごとにデータ取得することに成功しました。SDカードにもバイト数関係なくデータが言って時間ごとに書き込まれていました。
ただSDカードのの記録データを見ると、ところどころ取得データが間違っているような現象が見られました。
まだ精査が必要そうです。
具体的には、
- 割り込み時にデータをインクリメントする
- 割り込み後は一回だけファイル書き込み(バッファへの書き込み)を許可する
- ファイル書き込み
- 割り込み待ち
の繰り返しなのですが、たまにインクリメントされないデータが見受けられました。 >>93
乙です。
私もタイマー2でやってる例を見つけました。
一緒に勉強させていただきました。 >>88
人工呼吸器ってこんなブロワーファンで大丈夫なんかね
ダイヤフラムポンプとかでしっかり吐出&吸引しないと肺に出入りしない様な あとちょっとが足りなくて酸素飽和度が下がって体力が失われる
みたいなぎりぎりの所をなんとかするレベルのものでしょう。
その後さらに悪化したらこれではアウト。 >>88
MITでも始まってるようだけど、これは(救命救急用?)手動式を電動機構で駆動するみたい
ペースは手動より正確だし、無いよりは遥かにいいかと ■ このスレッドは過去ログ倉庫に格納されています