Arduino初心者熱烈大歓迎質問スレ part30
レス数が950を超えています。1000を超えると書き込みができなくなります。
コートスプレーならハヤコートとか。使ったことないけど。 Arduinoに直接関係はないのですが、seeed のGrove-RS485
を入手して遊んでいますが、TXDENを操作しなくても送信と受信が出来るんです。
https://i.imgur.com/vDoHqod.png
これが回路図なのですが、ピンクで囲んだ部分。
*REとDE が 5Vに接続しています。
トランシーバーは、この場合、送信は出来て受信は出来ないのかな
と思っていましたが、両方問題なく出来てしまいます。
https://www.maximintegrated.com/jp/products/interface/transceivers/MAX13487E.html
この中に、「AutoDirection制御付き」という事があります。
これがつまり、TXDEN の操作は必要ないという機能なのでしょうか?
もし、そうなら、この機能の注意点とかありますか? >>853
その回路図のMAX13487Eのシンボルが間違っているだけ
MAX13487Eのシンボルを作るのが面倒くさかったのでしょう 俺みたいな爺さんの戯言だけど
回路図を描くのは基板製作の為に行うネットリスト生成ツールとしか考えていない人が多い気がする
回路図を他人に見てもらうという考えが無いんだな カメレス
>>752
> 水晶ごとに発振周波数の前提にしている負荷容量があること、外付けする容量ではなくICや実装時に結果的に発生する容量も込みであること
肝心な事が抜けている。
負荷容量は、水晶のL成分と負荷容量のC成分で共振回路を形成する。
コルピッツ発振回路で調べるといい。
余談
負荷容量、俺的には水晶屋がマイコン屋に分かりやす〜く説明するための造語だと思ってる。
あの容量は共振回路の一部であって、負荷ではないからさ。 ProMicro安いの探してるんですが、
蟻/item/32788040866.html
これ、ProMicroですよね?写真を見る限り、32U4乗ってるんだけど、
ATmega328とも書いてて、ボード選択ではMicroを選んでる。
どっちなんでしょう? >>857
> ATmega328とも書いてて
英語読めないの? うわ983円もすんのか、pico買えちゃうじゃん
前は300円台だったのに3倍近いな ProMicroとか300円切ってた時代に買ってたな 124円のdigisparkで充分だったのでProMicroは買わなかった
PC用のTVリモコンとして今も使ってる >>858
まだ小学生なので、簡単な英文しか読めません。 >>857>>858
TZT Pro Micro ATmega32U4 5V 16MHz Replace ATmega328 For arduino Pro Mini With 2 Row Pin Header For Leonardo Mini Usb Interface
我らTZTが販売するPro Micro!ATmega32U4マイコン搭載!こちら5Vで16MHz動作のバージョンです!!
Pro MiniなどATmega328Pが乗ったボードから乗り換えにもオススメ!!レオナルドと同じ小型のUSBコネクタ!2列分のピンヘッダ付き!
と書いてあると思う。 >>ID:JsSOhLtJ
自分から水掛け論に持ち込んだ挙句に自滅w >>871
「素晴らし理屈を発見した俺偉い頭良い」は>>868に対して言ってるのですよ
人にバカというものがバカ。これは名言ですよ。
これに似たもので「ディベートに於いて誹謗中傷はご法度」というものもあります。
なぜなら誹謗中傷したほうが、結果不利になる。結局、不利益を被ることになる。
日本は幼少期からディベートについてもっと学習させたほうがいい。 「人にバカというもの」はバカだといってるのでそいつ自身もバカに他ならない。
「人をバカ呼ばわりしてはいけません。」と、普遍的な表現を使えばいいだけのこと。
勝手に「名言」扱いしてよく考えずに使うから結局負け犬の遠吠えになる。 7segとネオピクセルとロータリーエンコーダーを同時に使用したいです。
7segはダイナミック点灯をms2タイマーで制御したいのですが、ロータリーエンコーダーも出来ればタイマーで動きを感知したい。
複数の用途にタイマーを使う方法は関数にしてまとめれば良いのでしょうか? analogWriteによるPWM出力のデューティ(%)って
(指令値/255)×100 %
ってことで良いですか?
分母が256でないのがちょっと気持ち悪いですが >>875
ロータリーエンコーダーをタイマーで云々が意味分からん
B相を割り込みトリガーにしてその時にA相がONしてるかOFFしてるか調べるんじゃないの? >>877
ロータリーエンコーダをタイマのカウンタで、カウントしたいって事じゃないかな? >>875
1つずつタイマー割り振ると足りなくなるので
millis()で次のイベント処理までの経過時間を計る方法があるよ
7セグのダイナミック点灯は60fps以下だとチラついてしまうから16msの優先処理にして
ネオピクセルは100ms周期でイベント処理するとかメインループに書く
ロータリーエンコーダーは割り込みで処理するけど
こっちも前回の割り込み時間millis()を保持して
50ms以内ならチャタリングとみなして無視するか
0.1uFのコンデンサを入れてハード的に処理する方法もあるよ >>880
10個のテクニックが盛り込まれた回答! >>876
分母自体は256
255を指定するとDigitalWriteのHIGHが呼び出される
なので254と255の間にパルス幅に1つ飛びがある
なんでこうなってるかはD7とD8の隙間50milと同じような設計上の問題 >>882
ありがとうございます
(i)指令値が0-254の場合:(指令値/256)×100 %
(ii)指令値が255の場合:100 %
ということですか。
厳密さが必要とされる場面では少し気を付けた方がいいかもしれませんね
勉強になりました >>883
ああ、この問題があるのはUnoで言うとD5とD6だけ(タイマー0がFast PWM Modeで使用)なので
D9とD10(タイマー1をPhase Correct PWM Modeで使用)
D3とD11(タイマー2をPhase Correct PWM Modeで使用)
についてはそのグリッチは無い(こちらは分母自体が255のため)
他のArduinoについては自分でコアのソースを見てくれ >>884
ありがとうございます
私が使おうとしていたピンはUNOのD9-11なので場合分けはしなくて済みそうです それのせいでタイマー0に関しては自分で実装しないとanalogWriteでデューティ比50%は決して出せない
しかしタイマー0を弄るとmillsと(殆ど使わないがdelay)が死ぬ >>886
タイマー0を使ったD5、D6なら分母が256なので128を指令すれば50%になる...という話ではないのですか? >>886
ん?逆じゃね・・・?
タイマー0を使うところは分母が256でタイマー1と2は255だから
50%が出せるのはむしろタイマー0のほうな気がする
analogWriteで127指定したらたぶんD5とD6はぴったり50%が出るけどD3,9,10,11は50.2:49.8くらいになるんじゃないかな・・・?たぶん >>880
全部やってみます。
ありがとうございます ちょっと気になったのでチェックしてみた
UNOにて analogWrite(127)で出力
https://i.imgur.com/uG8c4r7.png (D5,D6)
https://i.imgur.com/x8Hnghh.png (D3,D9,D10,D11)
888さんの言う通りの結果だった >>890
D3の方は127/255で49.8%になるのはわかるんだけど、D5の方ではなぜ127/256がちょうど50%になるんだろう? >>892
D5,D6の場合(Fast PWM mode)
OCR0A=0; で強制的に0に設定したらHighの時間が0usではなく4usになった
OCR0A=1; この場合だとHighの時間8usでした OCR0A=127;なら512us
Timer0とOCR0Aの比較で一致した瞬間にLowではなくカウントアップ時にLowに変わるようです 高速PWMモードだと比較値が0のとき1パルス分の長さのHIGHが出るAVRの仕様
データシートの81ページの頭に書いてある
位相PWMモードだと0と255がそれぞれLOWとHIGHになる
データシートの82ページの上から2割位の所に書いてある
なぜタイマー0だけが高速PWMモードなのかというのは恐らくだけど
delayとmillis実装のための割込にも使っていてプリスケーラ1/64でTOP値0xFFの8bitタイマーなら
周波数が976.5625になるから1msのカウントを組みやすかったのかなと
かつそれでanalogWriteの値を他の位相PWMモードのと合わせようとした結果
分解能が1違うからdutyの端っこを2つ纏めることになってシワ寄せを受けている ちなみに高速PWMモードだと出力を完全に止めるにはタイマーを止めるかポートの制御をタイマーから切り離すしかない つまり
(i)D5,D6:((指令値+1)/256)×100 %
(ii)D3,D9,D10,D11:(指令値/255)×100 %
ってことでいい? >>896
arduinoではanalogWriteの0と255はタイマから切り離してLo/Hiという特別な扱い
なのでD5とD6だけ式だけじゃ表せない(0のとき強制オフ) >>897
では
(i)D5,D6
(ia)指令値が0:0%
(ib)指令値が1-255:((指令値+1)/256)×100 %
(ii)D3,D9,D10,D11:(指令値/255)×100 %
ならどうでしょう? AC100V機器にリレーで電源供給するとI2Cのディスプレイ表示が瞬間的に
文字化けしたりするんだけど簡易な対策はありますか? まずは原因をある程度絞り込まないと
例えばリレーのコントロールをマイコンから外して直接オンオフしても発生するのかとか
AC側の機器があるのかないのかとか
電源ラインのノイズ対策をちゃんとしてるか?とかブレッドボードで怪しい接続のままなのか基板にしてるのかとか >>901
I2Cディスプレイの電源に1000uFと0.1uFのコンデンサをつけるとだいたい解決する ちなみにモーター使う時みたいにリレーの電源両端に
パスコン入れるのは効果的でしょうか? >>908
リレーのコイルにはダイオード、接点にはコンデンサ 最近、arduinoをつかってみたのですが
デジタルピンをプルアップに設定して、内部プルアップ抵抗を使う事にして
ICから直でDIPスイッチに接続してるんですが、大丈夫ですよね?
ネットで見ると、プルアップで抵抗なしに
プルアップ設定で直結すると壊れるという記事もあるんですが・・・
とりあえず、書いたスケッチの動作確認では問題なく動作しております。
300〜10kΩ程度の抵抗をかますのが安全なのでしょうが、配線がゴチャゴチャするので
直結で問題なければこれで使いたいのですが・・・ クロスフェードを7セグでやってみたいんだけど、よく分からない。ダイナミック点灯で4桁でやりたいんだけど、参考になるスケッチとか無いかな? >>913
プルアップで直結自体は大丈夫だけど
スケッチの間違いで出力設定(high)になったら最大定格を超える電流が流れて、故障や誤作動の原因になる
出力設定でもdigitalRead()は機能するので間違いに気づかない事も考えられる
保険の意味では抵抗を入れといた方が良い >>911
絶縁リレー回路が絶縁されてないじゃん
あとベース抵抗510Ωは小さすぎ
そしてベース - エミッタ間にも抵抗を入れるべき >>916
LEDが2個直列になってて3.0V必要な事は指摘しなくていいのか
別電源にすれば絶縁にはなるぞ プルアップとかプルダウンとかプルツーとか何言ってるかさっぱりわからん >>917
GNDが共通だから別電源用意しても絶縁されてないって指摘してるんだよ
リレーなんか使わずにオムロンとかのゼロクロス付きのSSRにすればいいのに リレーノイズの者です
コンデンサとダイオードを追加して無事に解決しました
アドバイスくれた方々に感謝 iphone単独でスケッチの書き込みとか出来たら超捗るのに…
PC経由してリモートならあるんだよな確か >>915
ありがとう
保険で抵抗つけときます
人にあげる可能性もあるし I2CのEEPROM(24LC256)への書き込みの質問です
Wire.beginTransmission(deviceaddress);
Wire.write(eeaddress >> 8); // MSB of EEPROM Address
Wire.write(eeaddress & 0xFF); // LSB of EEPROM Address
Wire.write(data, length);
Wire.endTransmission();
length = 8byteまではうまく書き込めるのですが、
もしかして最大8byte単位という制限がありますか。 連投すみません。ページをまたがった連続書き込みはできないということに気が付いていませんでした。
一旦、質問を引かせていただき、自分で試してみます。 ググって探せました。
1. EEPROMは通常64アドレス分が1ページになっている(モデルによって違う)
2. Wire.write(data, length);でページをまたがった書き込みは出来ない
64byte以上の配列を書き込む時は上記の考慮が必要でした。 i2c接続で、EEPROM、OLEDまではよかったんだけど、PSoCをSlaveでぶら下げたらら、PSoCのレジストリには書き込めません。
I2Cのアドレスは0x08でかぶってないハズです。
EEPROM、OLEDの部分を外して、Arduino対PSoC単体では、書込み出来てます。
漠然としてますが、どこから手をつけたらいいのか、アドバイスが欲しくて。
OLEDライブラリはu8x8とかいうものです。 >>927
浮遊容量が大きくなり、プルアップ抵抗を小さくしないといけないかも アナライザがあったのでつなげてみました。
正常動作時は下記でした。(A)
write to 0x08 ack data: 0x20 0x01 0x01
write to 0x08 ack data: 0x20 0x02 0x02
write to 0x08 ack data: 0x20 0x03 0x03
write to 0x08 ack data: 0x20 0x04 0x04
NGの時は下記です。(B)
write to 0x08 nak
write to 0x08 nak
write to 0x08 nak
write to 0x08 nak
(A)の時も(B)の時もハード構成は同じですがスケッチが異なり、
(A)はPSoCとの通信のみの最小構成にしています。
PSoC側のプログラムは(A)も(B)も同じです。
プログラムは(A)と(B)で異なるのですが、
同じコマンドが同じ順番に並べているつもりでいます。
Wire.begin();
の後に
Wire.beginTransmission(PSoC_SLAVE_ADDRESS);
Wire.write(cmd, sizeof(cmd));
Wire.endTransmission();
Delay(30); <- これいじっても変わりませんでした。
を4回繰り返しています。
これで、どういう状況かご想像出来ますか? 連投すみません。
u8x8.setBusClock(100000);
が必要でした。ちゃんとライブラリ説明のところを見ていませんでした。
結果、i2cバスは400kHzで動作しており100kHzと思っているPSoCは間違った認識をしていたようです。 PSoCかぁ… 面白そうだな…
ぼくもやってみるかRTOSとか… arduinoのプログラムって繰り返しだけど
1周どのくらい時間かかるの?
ディレイとかwhile?とか考慮しないで
プログラムの大きさもあるだろうけどまあざっくりで >>935
という事は命令1個あたりnSで動くのかな >>937
クロック周波数で考えるなら,例えばUNOなら16MHzなのでクロック周期は62.5ns
1命令を処理するのに何クロック掛かってるかはわからないけど,少なくとも62.5nsは掛かってる >>937
Arduino(UNO)なら1命令62.5nsだったと思う
コード1行でも掛かる時間は様々
例えば計算でも8bit(char)の足し算なら1us以下で出来るけど
float計算なら足し算の数十倍の時間が必要
digitalWriteなら1回 1us位だけど
analogReadは1回100us位の時間必要
実行時間を気にするなら実測するのが楽だと思う O(n^2)とか使いまくりんぐ…
まぁ莫大な配列とか使わないしね… (´・ω・`) すごい速いね
これじゃインラインアセンブラ使う必要も無さそう だからまぁ1秒間で地球7回り半と思っとけば良いのさw 正味20行くらいの命令とdelay(10)が入ったloop()で、100周するごとに1秒と数えてデバグに出力させたら
1時間ぐらい走らせても1秒のズレもなくてえらく早いんだなとびっくりしたことがある >>944
クラスに1人、お前みたいなヤツが居たなぁw AVRで早さを求めるならフルアセンブラで書けるようにしておいた方がいいよ。
Arduinoを使う意味が無くなっちゃうけどさw 今の主流はそんな手間掛けるよりもっと高性能なuCに変えてリッチな環境で開発を続けることな気がはするけどね
8bitで16MHzのAVRから32bitで72MHzのSTMに乗り換えたとして掛かるコストが少なすぎる・・・下手すると高性能な方が安い場合もある
もちろんアセンブラで書くのは面白いし好きだから趣味としてやることを否定するわけではない 正確に言えばCPUの種類ごとにアセンブラは異なるけど、
一機種についてマスターすれば他にも応用できるよ。
フルアセンブラで書く面白さ、楽しさがあるし(CPUに密着しているような感覚かな)
AVRのような小さなCPUでは、フルアセンブラでないと実現出来ない仕様もある。
ま、CPU電子工作ライフの将来の選択肢の一つですね。 一つのマイコンでアセンブラで性能引き出さなきゃならんようなものなんて限られているだろうし
そういうレベルのものを作るときはそもそもArduinoとか選ばない気はしないでもない
まぁATTinyでそこまで実現したのすげー的なの目指す遊びはあるけれども レス数が950を超えています。1000を超えると書き込みができなくなります。