X



トップページ電気・電子
1002コメント394KB
Arduino初心者熱烈大歓迎質問スレ part27
■ このスレッドは過去ログ倉庫に格納されています
0001774ワット発電中さん
垢版 |
2020/03/27(金) 22:35:43.08ID:HSKIGC4f
http://www.arduino.cc/

【質問者心得】
・スレに一応目を通してから質問しましょう
・回答者はエスパーではありません。状況が分かるように詳しく書きましょう
 詳しく書いてくれないと、答える方も困ってしまいます。答えようがないのです
【回答者心得】
・すぐにググレカスと言う前に「○○でググれカス」って言うような大人の余裕を見せつけてやりましょう
・節度ある初心者さんには、特に優しくね

前スレ

Arduino初心者熱烈大歓迎質問スレ part26
http://rio2016.5ch.net/test/read.cgi/denki/1579146318/

過去スレ


Arduino初心者熱烈大歓迎質問スレ part25
http://rio2016.5ch.net/test/read.cgi/denki/1568358922/
Arduino初心者熱烈大歓迎質問スレ part24
http://rio2016.5ch.net/test/read.cgi/denki/1554776918/
Arduino初心者熱烈大歓迎質問スレ part23
http://rio2016.5ch.net/test/read.cgi/denki/1541233445/
Arduino初心者熱烈大歓迎質問スレ part22
http://rio2016.5ch.net/test/read.cgi/denki/1534549073/
Arduino初心者熱烈大歓迎質問スレ part21
http://rio2016.5ch.net/test/read.cgi/denki/1527252804/
Arduino初心者熱烈大歓迎質問スレ part20
http://rio2016.5ch.net/test/read.cgi/denki/1514503488/
Arduino初心者熱烈大歓迎質問スレ part19
http://rio2016.2ch.net/test/read.cgi/denki/1500745528/
Arduino初心者熱烈大歓迎質問スレ part18
http://rio2016.2ch.net/test/read.cgi/denki/1485192244/
Arduino初心者熱烈大歓迎質問スレ part17
http://rio2016.2ch.net/test/read.cgi/denki/1471967293/
0004774ワット発電中さん
垢版 |
2020/03/27(金) 23:45:20.85ID:yNZBgP0P
>>3
同意
だったら初めからメインでポーリングでmillis監視しとけって話
そもそもモーター止めるだけなんだから割込みルーチン内でやっちまえばいい
いずれにしても2重に監視する意味が不明
0008774ワット発電中さん
垢版 |
2020/03/28(土) 07:38:47.33ID:6RrQiTD6
>>3
激しく同意w
二つの問題がある。
1. 「割込み処理内でフラグをセットして、
 バックグランドでそれをポーリングして検出したら処理を始める」
というのは、割込みルーチンの中で処理すれば不用なことなのに、
プログラムをムダに複雑にするだけです。

2. ポーリングループのフラグ検出タイミングによっては、処理が始まる時間にバラツキが生まれる。
これは重大な問題を生じる可能性がある。
以前にある会社から
「パルスモータで位置制御をやっているのだが、停止位置が微妙にズレる時がある」
と相談された。
調べたら、
 原点センサを検出したら位置情報をクリアしているのだが、
 割込みでフラグをセットして、メインでポーリングでフラグをチェックしている。
 ポーリングループの命令実行タイミングによっては、
 1パルス分だけモータが進んで検出する場合があり、
 結果として停止位置のバラつきとなって表面化している。
プログラムが大きくて複雑になると、ポーリングの時間間隔が長くなり、
この割込みフラグの検出タイミングのバラツキも大きくなる。
常に同じ遅れ時間なら(遅くてもバラツキが無いなら)、このズレの影響はまだ少ないのだが・・・

標語にもあるでしょ? 「今日できることを明日に延ばすな」ってw
0011774ワット発電中さん
垢版 |
2020/03/28(土) 10:36:44.49ID:5elxxVd9
(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として使えるのでお得?なのかもしれない

つづく
0012774ワット発電中さん
垢版 |
2020/03/28(土) 10:39:03.77ID:5elxxVd9
(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

つづく
0013774ワット発電中さん
垢版 |
2020/03/28(土) 10:41:31.67ID:5elxxVd9
(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が常に消えた状態っぽい
0016774ワット発電中さん
垢版 |
2020/03/28(土) 10:57:19.57ID:5elxxVd9
すまん訂正
>>11
>AT-TYPEを3へ変更
これは間違いか合っているか定かではない
ファームウェアのアップデート後はおそらくTYPE0なので
そのままでいけるかもしれない
さっきAT+TYPE3でやったらペアリング無理で、
AT+TYPE0でやったらいけた
0017774ワット発電中さん
垢版 |
2020/03/28(土) 11:00:33.10ID:5elxxVd9
あとCC2541hm10v540.binの初期パスワード(AT+PASS)は000000
更新後すぐに適当なBL接続できる.inoにスケッチして
BL端末でそのパス通せばペアリングできた
以上、連投すまん
0018774ワット発電中さん
垢版 |
2020/03/28(土) 11:12:14.36ID:EO6+5rl/
>>8
通常そういう装置ってロータリーエンコーダーがモーター軸か機械軸に取り付けてあるんじゃないの?
原点復帰する時に原点センサー検出した後の
ロータリーエンコーダーのZ相検出を原点にするから
毎回位置ずれなんておきないように装置設計するはずだし
そもそもモーションコントローラーにコマンド投げるだけで勝手に動作するから
メインのCPUに割込使うこともないはずだが
0019774ワット発電中さん
垢版 |
2020/03/28(土) 11:40:52.15ID:gatV1hjW
そもそも990はモーターからの続きなの?
全般の話じゃないの?
0020774ワット発電中さん
垢版 |
2020/03/28(土) 11:57:19.56ID:rJk4A9K1
>>953
メイン
・lcdtime>30 で表示処理
・表示終わったらlcdtime=0
通信など
ループ

割り込み 0.1秒
・lcdtime++
・モーター作動ならmotertime++
・motertime>300 ならモーター停止
・モーター作動処理

俺様が答え書いてんのに
肝心のモーター作動処理をメインに持ってくとは何て頭が悪いんだ
メインループが止まったりもたつくから問題なんであって
そこに処理させたら遅延して当たり前
0021774ワット発電中さん
垢版 |
2020/03/28(土) 12:21:12.18ID:vLUSTFoV
横からですみません
割り込みではフラグ立てるだけのほうが良い場合ってある?
0022774ワット発電中さん
垢版 |
2020/03/28(土) 12:25:46.62ID:gatV1hjW
良い場合も何もそこから派生する処理があるならそれ以外有り得ないだろ
0023774ワット発電中さん
垢版 |
2020/03/28(土) 13:19:08.51ID:G0o5o2Fa
>>21
排他処理が必要な場合、メインで一括して書くほうがデバッグが楽だったりする。
リエントラントでない処理とか、メモリ割り当てが制限されるとか、割込み内でできない
ことはいろいろある。
0024774ワット発電中さん
垢版 |
2020/03/28(土) 13:21:34.43ID:G0o5o2Fa
方針として、出来るだけメインで処理を記述するが、
どうしてもだめなものだけ割り込み内でやる、もしくはタスクを分ける。
0025774ワット発電中さん
垢版 |
2020/03/28(土) 13:26:31.85ID:SrPaeTNM
なんでそう頭固いんだお前ら?
FM音源チップを使ってゲームのBGM流すのは、全部割り込み処理内でやってんだぞ

フラグ立て限定でもなんでもない
要はメインの邪魔せず、かつ割り込みの時間内できっちり仕事こなす前提で作ればなんだってやれる
0026774ワット発電中さん
垢版 |
2020/03/28(土) 13:34:22.09ID:gatV1hjW
それは常駐ドライバの形でメインのプログラムとは完全に別個の物だった奴の話じゃないの
0027774ワット発電中さん
垢版 |
2020/03/28(土) 14:13:57.93ID:FXsfgyn1
>>ID:5elxxVd9
ブログにでも書いてリンク張れよ、自分の非常識にすら気づけないのか
0028774ワット発電中さん
垢版 |
2020/03/28(土) 14:16:26.99ID:6lNvNr95
>>8
>>4が3行でまとめてることを20行以上に膨らませて書き
うちほとんどが昔話で占められるバカ
0030774ワット発電中さん
垢版 |
2020/03/28(土) 14:46:19.56ID:sjftX5EZ
>>21
不定期に発生するような外部割込みで
割込み発生後にする処理よりメインでの処理の方が優先される場合があるとき

今回の話の発端のように30秒後にモーターを止めるとか瞬時に済む処理なら
フラグ立ててる間にモーター止められるのでフラグなんて無意味
まあ、それでもケースバイケースだけど、質問主は最後までフロー示さなかったから何とも言えない
0031774ワット発電中さん
垢版 |
2020/03/28(土) 14:53:07.97ID:v0C4J8f6
>>29
おまえ、あわしろいくやだろ。
0032774ワット発電中さん
垢版 |
2020/03/28(土) 15:24:45.00ID:OUNeLYyu
>>20
あんたのは割込みを使う意味があまり無い
それならmillisの値を取っといて比較するだけでいい
00338
垢版 |
2020/03/28(土) 15:39:02.64ID:6RrQiTD6
>>9
明石家さんまが「話にはオチが必要やろ」と言ってたのでw
というのは冗談だけど、単に電電板の殺伐とした雰囲気を和ませたいだけですよ。

>>18
パルスモータは原点検出後に移動距離分のパルス数を送れば位置決めできます。
脱調しないように、送り出すパルスレートの制御(加速、定速、減速)は必要ですが、
移動距離情報のロータリエンコーダからのフィードバックは不用です。

>>28
バカですみません。
あなたのようなバカでも分るように書いたら長くなりました。
私は御指摘の通り確かにバカです、カミサンからもよく「バカ」って言われます。
彼女を作って「イヤン、バカン」とか言われてみたいなw
0034774ワット発電中さん
垢版 |
2020/03/28(土) 15:45:25.41ID:6RrQiTD6
>>30
> 割込み発生後にする処理よりメインでの処理の方が優先される場合があるとき
状況を想像してみた。
たとえばメインでワードデータを命令2個で加算し、割込み処理でも同じワードデータを命令2個で加算する時、
メインで加算している時は割込み処理での加算は出来ない。
んー、これはメインの加算の前後で、単に割り込み禁止・許可すれば済む話か。
もっと複雑な処理かな?
0035774ワット発電中さん
垢版 |
2020/03/28(土) 16:07:48.81ID:EO6+5rl/
>>33
なんだステッピングモーターを使ったおもちゃレベルの話か
俺は産業用のサーボでのことを考えてたわ
0036774ワット発電中さん
垢版 |
2020/03/28(土) 16:20:07.85ID:+vfoIstY
Arduinoのスレしかも初心者スレで産業用サーボの話するバカ
0039774ワット発電中さん
垢版 |
2020/03/28(土) 17:55:28.81ID:6RrQiTD6
>>35
パルスモータをおもちゃと言い切ってしまう産業用機械の事を知らないズブの素人w
素人で何も知らないら口出ししない方が話が進む。
0041774ワット発電中さん
垢版 |
2020/03/28(土) 20:40:27.36ID:iwxyX0oq
>>8
>原点センサを検出したら位置情報をクリアしているのだが、
>割込みでフラグをセットして、メインでポーリングでフラグをチェックしている。
フラグ要らねえ
位置情報クリアくらい割込みルーチンで即座にやればいいこと
いちいちポーリングして他を回してるからそうなる
プログラマが頭悪いとそうなる
0042774ワット発電中さん
垢版 |
2020/03/28(土) 20:46:19.39ID:BSYerF2d
>>41
何でもかんでもメインに詰め込んでポーリングでまわしてやらせるのが趣味で
時々気が向いてタイマー割込み使ったとしてもそのメリットを全く活かせてない
こういう人が若干1名マイコン系スレを徘徊してるよな
少しは学習すればいいのに
0044774ワット発電中さん
垢版 |
2020/03/28(土) 21:21:48.66ID:TNIwBKaQ
>>42
その人もともとポーリングしかできなかったんだけど
自慢げにそれをマルチ何だかだとか言って吹聴して歩いて散々笑われ
そのときに割込み使えよバカって言われて初めて割込みってものを知ったんだぜ
でも学習能力無いから割込みルーチンでフラグ立てて結局ポーリングで使ってんの
笑っちゃうね
0045774ワット発電中さん
垢版 |
2020/03/28(土) 21:34:40.26ID:N7wzj8zK
>>32
お前も相当バカだな
millis比較するタイミングが適切に来なかったらどうなる?
30秒で止めなきゃいけないのに30.5秒だったら、オーバーだ
運転士だったら日勤教育で自殺案件だ
0046774ワット発電中さん
垢版 |
2020/03/28(土) 21:53:10.31ID:KIK6Qy3x
>.45
は?
millsでは見落とすけどポーリングでフラグをチェックするときには見落とさないのかよ
論点ずれてるぞ、馬鹿すぎw
0048774ワット発電中さん
垢版 |
2020/03/28(土) 22:43:22.51ID:N7wzj8zK
>>46
何言ってんだ間抜け
割り込み内で完了してるものを何故わざわざポーリングでフラグチェックする必要あるんだね?

割り込みの原理もなにも理解してねーようだな
004946
垢版 |
2020/03/28(土) 22:54:04.77ID:Ge4a7Eoa
>>48
は、何で俺?
>>8>>20に言ってね。
0050774ワット発電中さん
垢版 |
2020/03/28(土) 23:22:29.44ID:J23eHurY
arduinoってSD.h使ってのSDカードへデータ書き込みする場合、512Bbyteごとにキャッシュを更新してるらしいが
このバッファサイズを変更したいと思っています。
SD.hの中身から辿って行って、512Byteを指定している箇所を見つけたんだけど、その数値を変える以外に方法ありませんか。
0051774ワット発電中さん
垢版 |
2020/03/28(土) 23:22:48.86ID:N7wzj8zK
>>46は基地外でした
0053774ワット発電中さん
垢版 |
2020/03/28(土) 23:28:31.27ID:JBf+BuB6
>>ID:N7wzj8zK
お前も相当バカだな
何言ってんだ間抜け
基地外でした

毎度のことながら、いろんなヤツがいるわw
0055774ワット発電中さん
垢版 |
2020/03/29(日) 00:28:15.14ID:bsUq/DGM
>>50
それセクター書き込みのバッファじゃね
大きくするならいいけど小さくすると不幸になるよ
0056774ワット発電中さん
垢版 |
2020/03/29(日) 01:00:35.80ID:yKzDax5w
>>55
キャッシュじゃないんですか。その辺はよくわかっていない・・・
取得したデータをSDに書き込んでるんだけど、その周期を一定にしたいのに512Byteごとにタイミングがずれるのをなんとかしたいのです。
大きくしても結局はタイミングずれるしバッファ大きくなるずれが大きくなるので、いっそのこと毎回データを取るたびに書き込めばいいかと思った次第です。
flushは時間かかりすぎるので使いたくないです。
0058774ワット発電中さん
垢版 |
2020/03/29(日) 06:50:31.61ID:OsZVHbhJ
>>56
詳しくないけど、フラッシュメモリの書き込みはセクター単位で、バッファ無しで1バイト
ずつ512byte書き込もうとすると、同じセクターを512回書き替える事になるんじゃないかな
0059774ワット発電中さん
垢版 |
2020/03/29(日) 10:24:04.48ID:/h0zpf8/
ファイルサイズは大きくなるけれど、毎回のデータに512バイトになるように
ダミーデータを付加するのはどうでしょ。
0060774ワット発電中さん
垢版 |
2020/03/29(日) 10:28:32.63ID:yKzDax5w
>>58
実際には1バイトずつじゃなくてデータ長ごとに書き込みたいんだけど
それができるメソッドは公式にあるのだろうかという疑問でした。
データ取得の度にflushを使うとその都度10msかかるのでそれは避けたいけど、似たようなことをしたいのです。
0061774ワット発電中さん
垢版 |
2020/03/29(日) 10:30:10.65ID:yKzDax5w
>>59
なるほど。それもありですね。
0062774ワット発電中さん
垢版 |
2020/03/29(日) 11:09:17.81ID:/h0zpf8/
よくわからないのだけど、たとえば50m秒ごとに128バイトのデータを受けるとして、
あるときは直後にSDへの書き込みがあり、あるときは、150m秒後のデータ受け取りまで
書き込みが待たされることが問題なのでしょうか。

記録を終了する時点で、フラッシュするなら問題はなさそうだけど。
それとも、いきなり電源を落としたような場合に、どこまでが保全できているかが問題?
0063774ワット発電中さん
垢版 |
2020/03/29(日) 11:32:17.31ID:yKzDax5w
>>62
簡単に説明すると、
数msごとに数十バイトのデータ取得を行っています。取得データにはデータ取得の時間(起動からの時間)も含まれます。
取得データをSDカードに書き込んでいるのですが、書き込まれたデータを見ると、
基本は一定時間ごとにデータが取得できていますが、10数回に一回程度その時間が約3倍程度に伸びています。
その原因がセクタ書き込み?によるものと推測しています。
この3倍程度になる時間をなくしたい or 極力短くしたいというのが狙いです。

>いきなり電源を落としたような場合に、どこまでが保全できているかが問題?
flushは一通りデータ取得した後に行うので問題ありません。途中で電源落ちた場合にデータが保存されない点は今回は不問です。
0064774ワット発電中さん
垢版 |
2020/03/29(日) 15:06:38.17ID:/h0zpf8/
>>63
データの取得はタイマー割り込みでやってて、取得したデータは取得時間と一緒に
FIFOに入れてるのでしょうか。
ファイルシステムがビジーの間に、データを取りこぼしているような気がします。
0065774ワット発電中さん
垢版 |
2020/03/29(日) 15:13:42.36ID:yKzDax5w
いえ、割り込みは使ってないです。
0066774ワット発電中さん
垢版 |
2020/03/29(日) 15:18:45.38ID:VL1gSK91
>>63
自分も興味あったんで検索してみたけどもうここは見た?
https://arduino.stackexchange.com/questions/28540/how-to-increase-sd-card-write-speed-in-arduino
ざっくりとSDFat library使えって話と自前のバッファ用意しろって話の2つのようだが

まあほんとに速度が必要なら自分ならFATシステム使わずに直で書くかな
そもそもArduinohaは使わないかも
0067774ワット発電中さん
垢版 |
2020/03/29(日) 15:28:21.57ID:yKzDax5w
ありがとうございます。参考にさせてもらいます。
自分も腰据えてやるなら、別のマイコン基板使う方がいいなと思ってます。
0068774ワット発電中さん
垢版 |
2020/03/29(日) 17:24:31.37ID:OXoZwnc/
Arduinoを使うのを前提にするとしても
速度求めるならFATなんて使わない方が良さそうだけど
そういうライブラリは無いのかねえ
0069774ワット発電中さん
垢版 |
2020/03/29(日) 18:13:56.61ID:Sab4r7jE
SdFat使ってみましたが、多少改善されましたが劇的な変化はなかったです。

Write関数でバッファとサイズ指定した場合でも
0070774ワット発電中さん
垢版 |
2020/03/29(日) 18:15:14.44ID:Sab4r7jE
途中で書き込んでしまった、、、

Write関数でバッファとサイズ指定した場合でも、結局セクタ毎に遅延は発生しますかね。
一応試してみますがあまり期待はできないかな。
0071774ワット発電中さん
垢版 |
2020/03/29(日) 18:40:13.01ID:UZbis7m6
>>70
FATでファイルを開いたままにしといてどんどん書き込んでるんでしょ?
バッファが小さけりゃ小さいほど遅延も少ないのでは?
バッファサイズを色々変えて試してみましたか?
どういうスケッチになってますか?
0072774ワット発電中さん
垢版 |
2020/03/29(日) 20:17:47.11ID:yKzDax5w
>>71
もちろんバッファを小さくして、都度データをSDカードに転送できれば良いのですが、その方法を探していました。

で、色々調べてたんですが、そもそもやろうとしていることがSDカードのHardwareとしての仕様から無理っぽいとわかりました。
512Byteごとにデータを送るのは必須なので、データ取得タイミングを一定にする目的を達成するには、
1. データ取得の都度、データ量が512Byteになるようダミーデータを追加する
2. SDカードへのデータ転送速度を一度のデータ取得時間に比べて無視できるほど十分に小さくする
という方法しかなさそうです。
1は、一回あたりのデータ取得時間が現状よりも長くなる、2は現状の基板を変更する必要がある
ということで、今後どうするか考えます。

長々とお付き合い頂きありがとうございました。
0073774ワット発電中さん
垢版 |
2020/03/29(日) 20:21:40.37ID:r9ZMYvVo
>>72
ちょっと何言ってるのか分からないな
>512Byteごとにデータを送るのは必須
は?それ誰の都合?
0074774ワット発電中さん
垢版 |
2020/03/29(日) 20:23:08.81ID:AM3YROnG
データ取得と書き込み処理を分けて暇なときに書き込むようにすれば?
0075774ワット発電中さん
垢版 |
2020/03/29(日) 20:32:41.25ID:yKzDax5w
>>73
え、違うのか?と思ったけど、確かにflush使えばバイト数関係なかった。

>>74
基本、暇なときがないわけですが、それでも現状なるべくそうなるようにしています。
データ取得するにあたってセンサにコマンド送ってセンサがデータ取得するのを待つ必要があるんですが、その間に書き込みを行ってます。
その時間が極めて短いので、512Byteごとにデータ転送による待ち時間が出現してしまうんですが。
512Byteのデータをまとめて送る必要がないならそれも可能ですが、その方法がわかんねーっす(flush除く)。
0076774ワット発電中さん
垢版 |
2020/03/29(日) 20:39:14.32ID:yKzDax5w
いや、flushはまた意味が違うな。
0077774ワット発電中さん
垢版 |
2020/03/29(日) 22:05:31.65ID:OsZVHbhJ
そんなクリティカルな問題なら、Pro miniか何かもう一つ繋げてシリアルで
データ送ってそっちで書き込めば
0079774ワット発電中さん
垢版 |
2020/03/29(日) 23:12:06.24ID:pLdQUquz
いつもの釣りなんだろ
0080774ワット発電中さん
垢版 |
2020/03/30(月) 01:22:45.03ID:n+q9a5hz
割り込みを使ってない、ということは
・時間待ち
・データ取り
・ファイル書き込み
のループなのですよね。
ということは、
[期待するループ時間]<[ファイル書き込み遅延時間]
が発生したら、問題のような現象は必ずおきるし。
SDへの書き込みがセクタ単位ってことは、書き込みのタイミングによっては、
ファイルアロケーションテーブル(FAT)への書き込みも連鎖的に発生するし、キャッシュが
小さければ、いったんFATのセクタ読み出しも行ってから書き込みを行うことになるはず。
おまけに、次のクラスタに移るときは、空きクラスタを検索する場合もあるかもしれない。
マイコンのスピードを上げても、ファイル書き込みは時間がかかることはある。

データ取りは割り込みで処理して、FIFOに入れていかないと。
0081774ワット発電中さん
垢版 |
2020/03/30(月) 05:43:46.15ID:cZ/ywqKn
>>80
>データ取りは割り込みで処理して、FIFOに入れていかないと。
で、それいつ処理すんのさw

書き込み時間>データ取得間隔
である以上、どんな方法でも絶対に実現できないよね
割込みとかFIFOとか何の話やら
0082774ワット発電中さん
垢版 |
2020/03/30(月) 08:21:48.76ID:n+q9a5hz
>>81
>書き込み時間>データ取得間隔
>である以上、どんな方法でも絶対に実現できないよね

(データ取得がSDと共通のSPIを使ってると話が違ってくるだろうけど)

>>63を見てもわかると思いますが、
書き込み時間が常にデータ取得間隔より長いわけじゃありません。


たとえば、

・データは5m秒に1回取り込む必要がある。
・ほとんどの書き込み処理時間は1m秒で完了する(実際のSDへの書き込みは実施されない)
・9回に1回、書き込み処理時間が20m秒程度かかる(実際のSDへの書き込みが実施される)

ということなら、

・10回にデータ取り込みで経過する時間が50m秒
・10回のデータ書き込みに29m秒

なので、処理時間の計算は成立するよね。

必要なのは書き込み時間が長いときでも、
・こぼさずにデータを取得すること
・そのデータを一時的にバッファリングするFIFOを設けること
0083774ワット発電中さん
垢版 |
2020/03/30(月) 08:47:47.25ID:nzAwqWOs
>>81が正しいと思います。
誤解を招いたかもしれませんが、センサーのデータ取得には、センサーへのデータ取得命令とセンサーからマイコンへのデータ転送命令を行う必要があります。
一連のループは、
@N+1回目のデータ取得命令(センサにデータ保存)
ASDカードへN回目のデータをSDへ記録
BN+1回目のデータ転送命令(マイコンにデータ保存)
の繰り返しです。@でセンサ側で数msかかるのでその間にAとBを行ってます。Aが長くなるとBが遅れます。

データの取りこぼしうんぬんは割り込み使う場合の話ですかね。上記を順次おこなっているので、データの取りこぼしはありません。

FIFOは関係ありますか。現状もデータはバッファに書き込んでます。バッファが512バイトになるとSD書き込みで時間がかかるという認識です。
上にあるように、マルチコアでSDへのデータ転送を別のコアが担当する以外の方法だと、多かれ少なかれ時間がかかってしまうと思います。
0084774ワット発電中さん
垢版 |
2020/03/30(月) 08:54:13.05ID:nzAwqWOs
>>82
すみません、言いたいことが理解出来ました。
SDカードへのデータ転送中でもデータ取得のタイミングで割り込み入れて、バッファにデータを溜めこむという事ですね。
それが出来るか謎なのと、大幅なコード変更が必要で時間かかりそうですが、試してみます。
0085774ワット発電中さん
垢版 |
2020/03/30(月) 09:15:30.12ID:Gq3otGoe
>>81頭悪すぎ
0086774ワット発電中さん
垢版 |
2020/03/30(月) 09:29:10.19ID:jANCWo7x
もしかして簡易的な人工呼吸器ってarduinoで作れたりしますか?
0087774ワット発電中さん
垢版 |
2020/03/30(月) 10:00:04.73ID:D7l+MYg+
医学は実験だし、余裕で作れるよ。

しかし結局はそれを自分に使ってほしいと人々が思うかどうかですね。
医学に対する人々の信頼があまりに崩れると文明そのものが崩壊しかねないので無茶は出来ない。お前もイヤだろ?
しかし医療崩壊が起きてギリギリの線でお前が死にかけている所で、Arduinoが最後の望みだ!という場合ならお前も喜んで使ってほしいと思うかもしれない。
状況によりますな。
0089774ワット発電中さん
垢版 |
2020/03/30(月) 11:17:34.76ID:7ICXccZf
マイコンなんかより人工呼吸器の他のパーツを準備する方が遥かに面倒だと思うんだけど、なぜArduinoで作れるのかという発想になるのかが不思議
0090774ワット発電中さん
垢版 |
2020/03/30(月) 11:35:44.83ID:D7l+MYg+
それは「俺の方が考えが上を行っている」という単なるマウント取りでしょ。
0091774ワット発電中さん
垢版 |
2020/03/30(月) 14:05:14.36ID:iZrvhVtI
>>82
ライブラリをちゃんと見てないんだけど、SDに書き込み中に割込み処理は可能なの?
SPIのクロックにタイマー使ってたりしてない?
0093774ワット発電中さん
垢版 |
2020/03/30(月) 14:16:17.35ID:y3bbOKBU
割り込み試しました。
結論としては、割り込みで一定時間ごとにデータ取得することに成功しました。SDカードにもバイト数関係なくデータが言って時間ごとに書き込まれていました。
ただSDカードのの記録データを見ると、ところどころ取得データが間違っているような現象が見られました。
まだ精査が必要そうです。

具体的には、
- 割り込み時にデータをインクリメントする
- 割り込み後は一回だけファイル書き込み(バッファへの書き込み)を許可する
- ファイル書き込み
- 割り込み待ち
の繰り返しなのですが、たまにインクリメントされないデータが見受けられました。
009491
垢版 |
2020/03/30(月) 14:33:31.32ID:JLp8e3Ru
>>93
乙です。

私もタイマー2でやってる例を見つけました。
一緒に勉強させていただきました。
0097774ワット発電中さん
垢版 |
2020/04/01(水) 03:31:35.35ID:rb0G7mI8
>>88
人工呼吸器ってこんなブロワーファンで大丈夫なんかね
ダイヤフラムポンプとかでしっかり吐出&吸引しないと肺に出入りしない様な
0098774ワット発電中さん
垢版 |
2020/04/01(水) 09:43:21.88ID:KSBaxES3
あとちょっとが足りなくて酸素飽和度が下がって体力が失われる
みたいなぎりぎりの所をなんとかするレベルのものでしょう。
その後さらに悪化したらこれではアウト。
0099774ワット発電中さん
垢版 |
2020/04/01(水) 12:11:50.13ID:RzZ6iuEB
>>88
MITでも始まってるようだけど、これは(救命救急用?)手動式を電動機構で駆動するみたい
ペースは手動より正確だし、無いよりは遥かにいいかと
■ このスレッドは過去ログ倉庫に格納されています