😽

Arduino応用

発展的な内容を主に扱います。組み込みシステムを作る上で必要になる機能を学べます。
💻
関数の配列
♦️
データ型について
🍭
定数について

Arduino課題0


スイッチを押した秒数を計測し、シリアルモニタに出力する。
💡
pinMode(ピン, INPUT_PULLUP);を使う。ネットで検索しながらやってみよう。
  • INPUT_PULLUPを使うと回路が簡単になります。
  • Arduino INPUT_PULLUPで検索してみよう。
またmillis();を使うと時間計測がしやすくなります。これも検索してみよう。

Arduino課題1


パソコンとシリアル通信をする。 パソコンからONをArduinoに送信したらLEDをONにする。 パソコンからOFFをArduinoに送信したらLEDをOFFにする。
💡
Serial.available()を使う。ネットで検索しながらやってみよう。 Serial.readStringUntil('\n')を使うと簡単にできます。 String型の変数を扱うので注意。String型についても調べてみよう。

Arduino課題2


超音波センサを使い、距離に応じて明るさを比例させる。
💡
超音波センサの値をanalogWrite(pin,value)のvalueに入れる比例式を作ろう。 valueは0~255までなので範囲を超えないようにプログラムを書いてみよう。 min(value,minValue); max(value,maxValue); constrain(value,min,max);などを使えるといいですね。調べてみましょう。

Arduino課題3


タイマー割り込みを使ってLEDをチカチカさせる。 タイマー割り込みは関数(サブプログラム?)をバックグラウンドで自動実行できる機能です。 一定周期で何かを実行したい場合はこれを使うと簡単に書くことができます。
💡
MsTimer2.h / flexiTimer2.hを使う。

Arduino課題4


スイッチを押した回数を押した回数をLCDに出力する。 ただし回数の計測にdelayを使ってはいけない。
💡
whileを使うとやりやすい タイマー割り込みを使っても良い ピン割り込み(attachInterrupt)を使ってするのも新規制があっていいと思う。ぜひ挑戦して欲しい。

Arduino課題5


スイッチを押した時にセンサの値を取得。 センサの値ランキング1位と2位をLCDに出力する。
💡
配列を使うと処理を書きやすい。

読んでみると勉強になる記事

かなりレベル高いかもしれないです。
電子工作初心者のために シリアル通信方式を分かりやすくまとめてみた - Qiita
自分の勉強がてら、シリアル通信方式を分かりやすくまとめました。 絶賛勉強中なので、ツッコミどころがあればご指摘いただけると嬉しいです。 全部読むのが面倒な人の為に、最後にシリアル通信方式比較表でまとめています。 データ伝送の間、デジタルデータを1ビットずつ順次伝送する接続方式のこと 特徴  回線数が少なく 低コスト  伝搬速度が 遅い  ⇒パラレル通信と比較し、 長距離間 のデータ伝送等に有利 複数の信号線を利用して複数ビットのデータを同時に伝送する方式 特徴  伝送効率が 速い  回線数が多く 高コスト  ⇒同一室内の 近距離 端末間等で利用される ここまで、シリアル通信とパラレル通信、それぞれメリットとデメリットを見てきたが、最近では、通信速度の高度化により、 シリアル通信が主流になりつつあるようである。 (詳しい人いたらコメントください) ⇒@sounisi5011 さんよりコメントいただきました。パラレル通信だと信号線同士で時差が生じることがあるが、シリアル通信だとその心配がない、ということのようです。 クロック同期 データ通信用の信号線とは別に クロック信号線を持ち、その信号を用いて送信側と受信側の同期を行う。 以下のような特徴がある。 ・ データ通信用の信号線の他にクロック信号線を必要とするため、 信号線の本数が増える ・ データ通信用に信号線が確保出来るため、 伝送効率が良い ex.) I2C通信、 SPI通信 調歩同期/非同期方式 送受信するデータの前後に"start bit"と"stop bit"を伝送することで、送信側と受信側の同期をする方式。 調歩同期方式とか非同期方式とか呼ばれているよう。名前がややこしい。 以下のような特徴がある。 ・ 同期のためのクロック線を必要としないため、 信号線が少なくてすむ ・ データ線とスタートクロック同期に比べ 伝送効率は悪い ex.)
電子工作初心者のために シリアル通信方式を分かりやすくまとめてみた - Qiita
C++11、Arduinoでどこまで使えるの? - Qiita
この辺を参考にしてます。 現時点でArduino.appが1.8.2です。 いつのころからかC++11が使えるようになっているらしいです。 ただし、いろいろ便利なライブラリはついてないとか。 素のArduino.appでどこまで使えるのか、まあ、何か便利な機能はないかな?程度のノリですが、いろいろ試してみました。 ちなみに、いろいろなコンテナ関連、ポインタ関連の機能は、自分の理解と利用の範囲を超えるので試してません。あしからず。 みたいなことができます。右辺値から変数の型を推論するそうな。 ただし、配列で同じようにするとエラーに。 配列にはこれまで通り int ARRAY_A[] = {1,2,3,4}; みたいな感じがいいようです。 みたいなことができます。 型はautoが使いやすいが、具体的なものでも問題ありません。 コピーコストが問題になる場合は、auto&& で参照するか、変更がないのであれば const auto& が使えるようです。 添字が必要な場合は、今まで通りか、要素が少なければ みたいにするかな。 みたいなことができます。 ただしSTLがないので、いろいろ便利なコンテナの類は使えないようです。 上下同じことになります。ラムダ式と同じ見た目。なれれば見やすい? 後置の場合、->型名 は省略できません。 autoって書いてあるけど推論してくれない... decltype(式)で式の型を返します。 で、戻り値の型を推論することができます。 上の三つをまとめると みたいなことができます。 即時で使えるほか、auto変数で受けられます。 関数の引数にできます。 ただし、ラムダ式に限らず、関数を返すことができないようです。 構造体で関数オブジェクトを作って同じことしてみました。ちょっと無理矢理ですが... やっぱりエラー。 どちらのコードも、paiza.ioで試したらエラーは出ませんでした。 使いどころがむずかしい... 今まで通り、簡単なことは普通の関数で、複雑なことは関数オブジェクトでやると思います。 constexprは、keywordとしてはハイライトされないけれど、コンパイルは普通に通るようです。 使いどころがまだよくわかっていない... でもまあ、「初期化と代入は違うぞ」という気持を込めて みたいな書き方にしようかと思います。 違ってるよ、とか、こんな便利な機能があるよ、というのがあればコメントおねがいします。
C++11、Arduinoでどこまで使えるの? - Qiita
安価な Arduino 互換機たち - Qiita
Arduino は「Arduino」という名前は商標で守られていますが、回路図、基板図、ブートローダ、ファームウェア等々はオープンソースハードウェア、ライセンス的には CC-BY SA で公開されているため、商用として同等製品を作って売ることや、好きに変更して売ることが可能です。 そのため、オフィシャル設計に代替チップを載せた安価なハードウェアや、同等のチップやブートローダで構成されているけど、オフィシャルラインナップには無いハードウェア等々、様々な Arduino 互換機が売られています。 本エントリーでは、私が購入してた安価な Arduino 互換機を ebay.com の購入リンクと一緒に紹介します。なお価格は特に記載が無い限り、2015年12月時点(1USD = 121.1円)の価格で、日本への送料無料です。 SainSmart は 日本の Amazon にもショップ を持つ、大手(たぶん...)の基板開発元です。シリアルUSB変換チップも安価な代替品を使っておらず、本家と同等の Ateml ATmega16U2 を使っています。 本家との違いは、本家の Arduino Uno R3 はピンソケットに解りやすい印刷があるのですが、SainSmart UNO にはありません。 こちらは SainSmart 社が出している Starter Kit に同梱されている UNO です。単体で買うと高い...。通常の UNO の取り外し可能な DIP ではないマイコンのATMega328P-AUがのっています。また各種 GPIO の横にピンヘッダが出ており、通常のポートの他 VDD と GND のピンが沢山はえていること、電源横のスイッチで電圧を5V(標準)と3.3Vに切り替えられることが特徴的です。 名前の通り、Arduino
安価な Arduino 互換機たち - Qiita
Arduinoでバイナリ送受信のシリアル通信をするときのパケットの構造 - Qiita
2020.05.27 追記 ArduinoでPCや他のデバイスにデータを送りたいとき、シリアル通信使うことが多々あると思います。でも文字列 ( Serial.print()など) で送るのはサイズもでかいし、冗長だし、コンマでデータを区切りたくないし、もっと軽くしたい!バイナリで通信だ!ってなりますよね。わかります。 でもバイナリで通信するときには実際にはどんな感じのデータ構造で通信するの?ってところを具体的にまとめられればと思います。Arduinoでの基本的なシリアル通信のやり方は こちら で確認してください。 ここ違うよ!とか、もっとこんな方法があるよ!とか、世間一般ではこんな方法が有名だよ!などあれば、ぜひコメントしていただければ嬉しいです。 長くなってしまったので、まずはじめに結論です。これを頭に入れて読んでみてください! 0 - 255 の数値を一種類だけ送りたいときは、何も考えず垂れ流そう 0 - 254 で収められるデータなら、255をヘッダにしてパケットを区切り、データを0-254に制限しよう それ以上の整数や、小数を贈りたいときは、1byteごとに分割しよう もっとたくさんデータを送りたいときは、union を活用しよう 複数バイトで構成されるデータを送るときは、パケットに目印を入れて区切りを明確にしよう SLIP を使ってエスケープシーケンスで送る COBS を使えば SLIP よりも少ないデータ量に抑えられる ここまでやってもノイズなどの影響で変な値が来ることが多々あるので、誤り検出しよう もっと簡単にこういうシリアル送受信をしたい場合、こちらのライブラリをどうぞ シリアル通信データを軽くしたい 通信エラーを検出したい 文字列めんどう、文字列きらい、ArduinoのStringきらい バイナリで通信するとき、具体的にどうやってやるのさ? こちらの記事が大変参考になりました、というような方 シリアル通信でバイト列を扱うときのフレーム構造 バイナリでのやりとりに特化、文字列は扱わない 機種依存する整数型は使わず、cstdint の整数型のみ使う 便宜上一区切りのデータ構造をパケットと呼ぶ バイトオーダは無視する フロー制御に関しても無視 サンプルコードでは必要な全データが既にシリアルのバッファに積まれていると想定 シリアル通信では、1byte 0-255の数値を1単位として送ります。なので、こいつがいくつまとまって、どの場所のどの値がういう意味を持つか、をきちんと決めてあげないといけません。このシリアル通信でのデータ構造をパケットと呼ぶことにします。具体例に合わせて、シリアル通信のパケットをつくっていきます。 例: AnalogRead() した値を送受信する よくあるやつですね。とりあえずざっくりした1つの値だけを送りたいときには何も気にする必要はありません。垂れ流しましょう。 Arduinoに対して 0 - 255 のRGBの値を送り、指示された色でLEDを光らせたいことがあります。先程のように、0-255の値を連続して送ってしまうと、どれがRでどれがGでどれがB???ってなっちゃいます。こんなときにお手軽なのが、この方法です。ポイントは、こちらです。 データのはじまりを示す、ヘッダをくっつけて、それを他で使わないようにするだけです。簡単ですね。やってみましょう。 送信側で 0x00 ~ 0xFE に値を制限しているので、 0xFF はヘッダでしか登場しないはずです。 0 - 254 までの範囲しかデータとして使えませんが、簡単に通信することができました。この255段階のデータで充分ならば、無理に小難しいことをする必要はありません。こんな感じでサクッとパケットをつくりましょう! 0 - 255 じゃ満足できん!もっと大きな数値を送らせろ!整数ばっか送ってて何が楽しいの!?小数送らせてくれよ!ってことありますよね。そんなときはこんな感じで送ります。 int32_t, float はともに32bitで構成される数値です。これを8bitずつ (1byteずつ) 、4byteに分割して送っています。 こんな感じで切って貼ってをすれば、大きな値を送ることも可能ですね。 大きな値を送ることはできるようになったけど、たった変数一つだけ?送るとき毎回こんな面倒なことやるの??と思ったそこのあなた。 union を使ってもっと簡単にできますよ!例として、 float x3 の通信をしてみましょう。 こんな位置データを送りたいとします。 前節で説明したようなビットシフトを全部やるのは面倒くさすぎる、、、そこで union ...
Arduinoでバイナリ送受信のシリアル通信をするときのパケットの構造 - Qiita
ESP32 WiFiのSSID、パスワードを外部から設定しアクセスポイントに接続 - Qiita
posted at updated at 以下のライブラリを使用する WiFi Manager for ESP32 https://github.com/zhouhan0126/WIFIMANAGER-ESP32 このライブラリを使用するために以下のライブラリも導入する WebServer https://github.com/zhouhan0126/WebServer-esp32 DNSServer https://github.com/zhouhan0126/DNSServer---esp32 2021/3/14更新 WebServer及びDNSServerライブラリはESP32ライブラリに取り込まれましたので最新版では個別のインストールは不要となりました。 今回もこのボードにOLEDを取り付けて動作確認をする。 Unopuino32s https://www.switch-science.com/catalog/3456/ WifiBManagerのサンプルプログラムを参考に、OLEDにIPアドレス情報を表示する。 AP名: OnDemandAP にWiFiで接続し、ブラウザで"192.168.4.1"にアクセスするとWiFi設定が表示される。設定値はESP32のFlashに記憶される。 ESP32_OnDemandConfigPortal.ino #include //https://github.com/esp8266/Arduino #include #include #include //https://github.com/tzapu/WiFiManager // Include the correct display library // For a connection via I2C using Wire include #include "SSD1306.h" // alias for `#include "SSD1306Wire.h"` // Include Unopuino32 pin definition #include "Unopuino32.h" // Initialize the OLED display using Wire library SSD1306 display(0x3c, GPSDA, GPSCL); void setup() { display.init(); display.clear(); display.flipScreenVertically(); display.setFont(ArialMT_Plain_10); display.setTextAlignment(TEXT_ALIGN_LEFT); // put your setup code here, to run once: Serial.begin(115200); Serial.println("\n Starting"); // is configuration portal requested?
ESP32 WiFiのSSID、パスワードを外部から設定しアクセスポイントに接続 - Qiita
答え