Arduino初心者熱烈大歓迎質問スレ part22
■ このスレッドは過去ログ倉庫に格納されています
>>13
ライブラリ使ってるだけだと意識はしていないかもしれない。 製品企画も中華がパクって安いコピー品を沢山出してるから業界への貢献度はデカいよ >>9
失礼なことを書いて申し訳ございませんでした。
全く問題ございません。 20kHzなら設定できるdutyは0〜800だろ
クロックを周波数で割ったのが大体の分解能だ
0%か50%か100%の3段階でよければ8MHzだ
1%刻みなら160kHzだ Arduinoの中に書き込んだプログラムを取り出す方法はないですか?
PCをリカバリーしてPCに保存したデータを全てなくしてしまいました。 やっぱりそうですか、ご返信いただき、ありがとうございました。 バイナリなら読み出せるんじゃない?ソースは無理だけど 脳みそコネコネしながら逆コンパイルだ!w
>>1
乙〜♪ 流石にArduinoでゲームエミュレータってできないよな? バイナリ読みだしても最適化されまくりだから、ソースに戻せたところで、質問者の欲しいソースとはかけ離れすぎだろw
それでも問題ない輩は、そもそも質問者しねーだろうし、ソースのバックアップもしてるだろーな。 FLASHが余ってたらスケッチをLZMAの7zとか強烈なアルゴリズムで超圧縮してバイナリデータとしてROMのケツに書き込んどけwwww 展開するCPUが8bitなのはともかく、展開先のメモリをどうやって工面すれば…
せめて、ビデオメモリが展開先として使えたらいいのに。 >>26
エミュじゃないゲームならあるし
ファミコンぐらいなら余裕かと >>26
ゲームじゃないけど
appleIIのエミュレータなら有ったと思う。appleII上でゲームも可能だと思うよ。 >>32
Qiitaにあったの見てた
Gituhubにもあった
あれROM入れられないよね Arduino IDEとProcessingは何がちがうん? >>34
ArduinoIDEはArduino専用の統合開発環境。
ProcessingはJavaを単純化したプログラム言語のこと。(専用の統合開発環境も同名)
Arduino側のプログラムはArduinoIDEで作成して、
Arduinoの出力をPCで処理する部分をProcessingで書く。
後者はProcessingである必要はない。CとかPythonとかでもいい。
まぁ、作例がそれなりにあって、簡単だからProcessingを使うことが多い。 githubのライブラリーに付属のサンプルとかは、
.pde(Processing用のファイル)から、
.ino(Arduino IDE用のファイル)に変更していってるね。
更新してない古いライブラリーは.pdeのままだったりする。 ArduinoIDE自体がProcessingで書かれてるんじゃなかった? マイコン初心者です。arduinoスレで質問するのは違うと思うのですが、質問させてください。
無線でスタートストップラップをするストップウオッチを作りたいのですが、何(arduino raspi pic)を使ったらいいか、何を勉強したらいいか、どんな部品を使えばいいかわからないので教えてください。
センサC1 から無線で信号を受け取ったらストップウオッチS スタート
センサC2 から無線で信号を受け取ったらS ラップ計測
C3 から無線で信号を受け取ったらS ラップ計測
Cn から無線で信号を受け取ったらS ストップ
読み取りも無線でできたらいいなと思っていますが、SDカードかなにかに保存してみればいいかなと思ってます。
センサとストップウオッチの距離は10cm程度でそれ以下でも構いません。
なるべく小さく安く作りたいと思っています。
これ使ってこれ勉強しろで構いませんよろしくお願いします。 >>38
ESP-WROOM-02かな。
電池駆動とかどのくらいの距離離すかとかも書いた方が良いと思う。
LTEやLoRaじゃないと無理だわ、ってことも有るし。 >>39-44
ありがとうございます。電池駆動で距離は30cm程度です。
外で使うのでwifiモジュールは適していないのかなと思いました。
それとあまり距離は出さなくていいので今のところ赤外線モジュールが視野に入ってます。 距離30cm程度で無線の必要性がよく分からんけど
赤外線モジュールだと、位置関係もある程度制限されるし
片方をポケットとかバックパックに入れるわけにもいかんよね 赤外線は屋外だと太陽光の影響を受けて距離が短くなるよ。
と言っても30cmなら大丈夫と思うけど! ESP32を5個買って、青歯接続が無難かなぁ…
あとでパソコンへデータ送信するのも、無線LAN経由でらくらく送れるし。 青歯という隠語みるたびにどうしても青ノリが思い浮かぶ・・・ 最近の青歯は省電力じゃないの?
CR2032で半年とか持たせられるし。 使ったことないからあれだけど
電波飛ばすんだからその間は飛距離に応じた電気はくうよね? カシオのスマートウオッチ、3年ほど使ってるけど電池交換は半年に1回だけ、もちろんCR2032を1個使用。
詳しい仕組みはわからないけど、電気をバカ喰いすることはないんじゃないかと。 PCのワイヤレスキーボードとか単4電池一本で1年以上もったりするけど
あれどうなってんの?1.5vで動いてるの?3vに昇圧してんの?? >>56
大体は昇圧してる。
電波に関しては、スペクトラム拡散技術のおかげで、
かなり弱い電波でも受送信できるようになってる。 >>45
その程度なら、リモコンみたいな方式で赤外線で飛ばすのが手っ取り早くて消費電力も小さくて良いんじゃない?
主要なマイコンならちょっと調べればリモコンの製作記事見つかるだろう。
センサ側は16F1のpic@100円前後、受け側はnanoとかで十分。
使うセンサーによっては受け側以外はマイコンすら不要かも。
リモコン専用のチップ有るし。 ありがとうございます。
基本的には赤外線で、ストップウィッチの方にブルートゥースも乗っけて読み取りを楽にしようと思います。
まずはunoで地道に勉強しようと思います ブレッドボード上で抵抗の足同士が接触してVccとGndショートさせてUSBポート壊したんだけど
ポートを保護する方法を教えてください 青歯とか書いて悦に入ってるヤツって
いまだにすし屋でアガリとかオアイソとかガリ
とか言ってヒンシュク買ってそうだよなw 青歯が恥ずかしいのは当て字の中二臭さ、今時じゃなく始めから恥ずかしい。
寿司屋隠語は業界用語なので客が使うのは恥ずかしい。 中国では蓝牙というらしい
蓝は藍かな >>63
>>64
よかった
嫌な感じがするのは俺だけじゃなかったんだ processingとの連携を勉強中で教えて頂きたいです。
xbeeとxbeeシールドを使い、xctuを起動したPCへ無線で繋げたいと思っています。processing1.5.1を指定している数年前のページがあったりするんですが今だと最新版でも良いのでしょうか? TeensyってArduinoのvariantなん? do文の中にanalogRead入れたら値が全く読み込めない
なんで?
for文なら動いてます >>71
もしかしたらdo文が繰り返さず
1回で抜けてるかも知れない
whileの時間増やしても速さが変わらない >>70
ふたつのプログラムを見ないと何ともだけど、while文の抜け出し条件が未成率で無限に抜け出せてないとか?
do文が無しで1回のみ実行だとアナログ値は読めてる?
そもそも読めないって、読みに行ったら戻ってこないの? int analogpin = 0;
int count = 10;
void setup() {
Serial.begin(9600);
}
void loop() {
unsigned long clocks = millis();
int MAX = 0, MIN = 1023;
int data = 0;
int total = 0;
float ave = 0;
float mA = 0;
for (int i = 0; count < i; i++) {
unsigned long start = millis();
do {
data = analogRead(analogpin);
// Serial.println(data);
MAX = max(data , MAX);
MIN = min(data , MIN);
}
while(millis() - start <= 22); //50hz1サイクル20msプラス10%
total += int(MAX - MIN);
}
ave = total / count;
mA = ave / 2.0 / sqrt(2) * (5000 / 1024);
Serial.println(mA);
}
初心者だから読みにくいのは許してね
交流電流をクランプ式のセンサーで読み取りたいのです
電源は5vを4.7キロオーム2つで分圧してクランプの片側へ
クランプのもう片側はA0へ
クランプと並列に補助抵抗200オームをつけて
これだけの回路です
シンプルだけどfor文では動きました
質問のアナログ値1回は読めてるかどうかですが
スケッチ上にdo文の中にprintln置いていますが
それを生かすと止まります
故に読めてるかどうかは分かりません
出力はゼロをひたすら出力します 説明しますね
交流50hzなのでワンサイクル20ms
1割多めで22msワンサイクル分の最大最低を読み出します
それの10回分の平均を出して
計算して実際の電圧にします
最後の電圧から電流に変換する式が抜けてましたが float b = 0, c = 0;
int COUNT = 200;
int g[200];
void setup() {
Serial.begin(9600);
// analogReference(INTERNAL);
// ADCSRA = ADCSRA & 0xf8;
// ADCSRA = ADCSRA | 0x04;
}
void loop() {
float a = 0;
int MAX = 0, MIN = 32767;
for (int k = 0; k < 50 ; k++) {
for (int i = 0; i < COUNT; i++) {
g[i] = analogRead(0);
if (MAX < g[i])MAX = g[i];
if (MIN > g[i])MIN = g[i];
// Serial.println(g[i]);
}
a += MAX - MIN;
}
b = a / 50;
c = b * (5000.0 / 1024.0) / 2.0 / sqrt(2) * 10.0 - 500.0;
Serial.println(c);
}
これは成功と思われますが誤差は大きいです >>75
追記ですが最後の出力とはm Aのことです >>75
スマホで読んでて、しかも老眼なんで見間違えもあるかも知れないけど、for文の条件式が count < i になってると初期値が count = 10と i = 0 だと中身を実行しないんじゃない?
違ってたらゴメンなさい。 ちょっと関係ないけど、Loopの中で下記の変数が再定義されまくっても良いのかな?
ループする度に変数のアドレスを保持するパフォーマンス的によろしくないと思うんだけど?
コンパイラがどういうコードを生成してるか知らないので、これでも良いのかもしれないけど・・・
unsigned long clocks = millis(); <ーこれ
int MAX = 0, MIN = 1023; <ーこれ
int data = 0; <ーこれ
int total = 0; <ーこれ
float ave = 0; <ーこれ
float mA = 0; <ーこれ
for (int i = 0; count < i; i++) {
unsigned long start = millis(); <ーこれ 変数は結局コンパイラに全部関数の最外スコープにまとめて定義する形にされるのでは? >>75
for (int i = 0; count < i; i++) { あんま気にしなくて良いんですね・ありがとうございます。
引き続き、>>70さんのdo-while内のanalogRead問題をどうぞ for (int i = 0; count < i; i++)
じゃなく、こうだ
for (int i = 0; i < count ; i++) >>85
動きましたー
ありがとうございます
よかったー お騒がせしました
みなさんありがとうございます
また色々参考になるご意見今後の参考にします
またご質問させていただくことがあると思います ほんといろいろな意味で気持ち悪いコード
adcサンプリング周期とか無視かよ
millis() の使い方それでいいのか
analogReadは ADSCでのポーリング読み込みだから
あらかじめハード的に周期を観測して決めなければならない
というか、はあ、初心者はそういう発想で来るのねという感想 >>90
ど素人なのでご容赦ください
サンプリング周期??
ネットで調べたらアルデュイーノのanalogReadは量子化を考えてサンプリング定理でローパスフィルター入れてって書いてあったから
入れてみたけど失敗しました Arduino電力計 - 回路図とスケッチ
でググれ 床屋行ったので書いてみた
timerone ライブラリを使用しているので、gitからダウンロードしてね
/*
50Hz meas
use lib :
github.com/PaulStoffregen/TimerOne.git
1/50Hz = 0.02 (1 period)
0.02 / 100 =0.0002 =200u ( 100 sample = 1 period)
*/
#include <TimerOne.h>
#define SAMPLE_SZ 100
#define SAMPLE_PERIOD 200 // us
#define BLOCK_SZ 50
#define BLOCK_SZ_INV (1.0/50.0)
int sample_buf[SAMPLE_SZ];
int sample_buf_p;
int sample_buf_ready;
void isr_timer1() {
int data;
if( sample_buf_p < SAMPLE_SZ ){
data = analogRead(0); // wait for ADC
sample_buf[ sample_buf_p ] = data;
sample_buf_p++;
}
if( sample_buf_p == SAMPLE_SZ ){
sample_buf_ready = 1;
sample_buf_p++;
}
}
void setup() {
Serial.begin(9600);
sample_buf_p = 0;
sample_buf_ready = 0;
Timer1.initialize(SAMPLE_PERIOD); // unit=usec
Timer1.attachInterrupt(isr_timer1);
}
void loop() {
int i,j; int data;
int max; int min;
float sum; float avr;
float val;
sum = 0;
for (j = 0; j < BLOCK_SZ; j++) {
while( sample_buf_ready == 0 ) ;
max = 0;
min = 32767;
for (i = 0; i < SAMPLE_SZ; i++) {
data = sample_buf[i];
if (max < data) max = data;
if (min > data) min = data;
}
sample_buf_p = 0;
sample_buf_ready = 0;
sum += ( max - min );
}
avr = sum * BLOCK_SZ_INV; // outer loop sz
val = avr * (5000.0 / 1024.0) / 2.0 / sqrt(2) * 10.0 - 500.0;
Serial.println(val);
} ああ、ダブルバッファにしてなかったから
これはボツだ
まあ、参考にして書いてみて >>97
感動しました
ありがとうございます
参考にさせていただきます インデント無いのはまったく見る気しないね。
次のテンプレにこれ入れて。
http://codepad.org/ 蛇足
コンパイラがどう解釈するかだけど
sqrt(2) が定数にならないかもしれないので
1.4142135とか数値で書いたほうがいいかも //(5000.0 / 1024.0) / 2.0 / sqrt(2) * 10.0
17.2633491501
そんなとこまで気にするならいっそのこと固定値 Ethernet PHY付けて通信する時はSPIから線を延ばせば良いのね?
遅そうだけど 長文ですみません。複数のアナログ値の読み込み時の動作ついて教えてください。
今作っている装置では、ArduinoNanoのA0,A1,A2,A3,A6のポートに合計5つのセンサーが取り付けられています。(4と5はI2C)
AD変換完了割り込みベクタを使って、ADMUX書込み(チャネル変更)→ADSRAのADSCをセット(変換開始)して最速で回しているのですが
これで全5つセンサーのデータを正しく読み込めているんでしょうか?動きはしますが、他のポートに繋いだセンサの影響が出ています。
(例えばA0のセンサを外して1kΩ経由で5Vに繋いだりGNDに繋いだりすると、関係ないA1やA2の値が引き摺られて変わります。)
サンプルプログラムを掲載している先人のウェブサイト(ArduinoだけでなくAVRマイコンの物も含む)を見ると
『ADMUXレジスタに書き込んで、マルチプレクサが安定するまで待つ』と言った記述をしているサイトが見受けられます。
これは経験則から来るものでしょうか?または、どこか公式の文献に記載されている所がありますか?
ATmega328Pのデータシートや、Atmel(今はMicrochip?)が発行しているADコンバーターに関する応用記述を読むと
基準電圧を切り変えた場合は最初のAD変換の結果は不正確なためこれを破棄することが推奨されていますが
マルチプレクサを(シングルエンド入力チャネル内において)切り変えた場合については特に言及されていませんでした。
ADコンバーターの設定はArduinoデフォルトのままなので16MHzが1/128されて125kHzが変換クロックですよね。
ADMUXに書き込んだ後ADSCが上がって即変換クロックのタイミングだった場合、マルチプレクサ変更から即ADCが始まったとして
データシートの仕様を見ると通常変換モードで、ADSC立ち上がり認識からサンプルホールド開始まで1.5変換クロックとあるので
この今のスケッチだと、マルチプレクサのレジスタが書き換えられてから、最速の場合でおよそ12μ秒後にサンプルホールドが始まっています。
この時間はマルチプレクサの切り替えに十分でないのでしょうか?(切り替えに10秒も掛かるマルチプレクサ...?)切り替えに必要な動作時間の記述が見つけられませんでした。
AD変換周期をカット&トライで伸ばして行けば、今回の結果が前回の結果に引き摺られる量が減ることを確認したので
値の引き摺りが我慢できるところまでサンプリング周期をテキトウに伸ばしちゃっていますが、サンプリング周期を設定する根拠が欲しいのです。
出来ればサンプリング周期は下げたくないので、もし、そもそも自分が何かミスをしていて上記問題を解決できる方法があれば教えてください。
サンプルホールド回路の入力インピーダンスに対してセンサーの出力インピーダンスが高いのかと思いましたがそうでもないようでした。 >>105
ミス:10秒もかかる→10μ秒もかかる 切り替え初回はゴミが入るかADC再起動しないと
正しい値は入らないだろうね
(チャージがリセットされない)
>根拠
データシートにしかないだろうね
丹念に読んで該当する項目内無いならあきらめるしかない
(無いとすれば)
メーカーも(ばらつき大きい等の理由で)保証しないのだろう
マルチプレクサをADCに外付けで多チャンネル化したことはある。
このときは、MPXの出力をオシロで見て波形確認したよ Arduinoって、micropythonをインスコして使えますか? >>105
データシートの28.5章(Page 310)以降を読むべし >>110
それに準拠して設計してあんじゃん
データシートと質問を読んで意味がわからないならレベルなら無理に答えなくていいよ これだけじゃどうせなんか言われるんで
>>105
ダイに印刷されてるようなマルチプレクサがそんな遅い訳あるか 切り替えに数十ナノ秒すらかからん
データシートに書いて無いのはそのマイコンの最速20MHzでも次の命令実行前に切り替えが終わってて無視できるほど速いから
単にS/Hキャパシタに前回の値が残ってるだけ 外部回路の出力Zは低いと言い張ってるが本当にそうか?
例えばLM35なんかはシンク駆動Zめちゃ高いぞ(データシートは低インピと謳っているがちゃんと見るとソース駆動の話だ)
センサーの出力段がプッシュプルじゃないんだろ LM35みたいなハイサイド+プルダウンじゃシンク側が間に合わん
抵抗分圧のPTCサーミスタやCSDセルなんかもダメな ADCを共用して入力するにはZが高い
このサイト読んでみ ↑と同じ話が書いてある 解決策も
http://siesta.la.coocan.jp/zk/AVR_ADC/AVR_ADC.html LM35Dには自分も半日トラブった。
資料は隅から隅までキチンと読まないと、と反省した。 ■ このスレッドは過去ログ倉庫に格納されています