Movatterモバイル変換


[0]ホーム

URL:


PPTX, PDF75 views

Lチカで終わらせないArduino シリアル通信 Part2(移行済)

移行 https://speakerdeck.com/tomit3/ltikadezhong-warasenaiarduino-siriarutong-xin-part2前回(https://www.slideshare.net/tomit3/larduino-part1)の資料の続き。ArduinoとPCの間で通信を行う方法についてまとめた資料です。LチカからPCとArduinoで通信を行う簡単な方法を説明しています。

Embed presentation

Download to read offline
続・Lチカで終わらせないArduino20210921初版20230406 公開用に一部修正
自己紹介とこの資料について• 自己紹介• ソフトウェア開発を仕事にしている• ソフトウェア、ハードウェアに限らずモノ作りが好き• GitHubに公開• 関連する資料もslideshareで公開(tomitomi3で検索)• この資料について• とある勉強会向けに作成した資料。ArduinoをLチカだけで使用するのではなく、便利なハードとして使うために「通信」させて使う方法についてまとめた。全2回の2回目。
概要• Arduinoを「Lチカで終わらせないために」をテーマに前回は、ArduinoとArduinoIDEを用いてLチカを行うまでの手順とPC-Arduino間で「通信」を行う方法を紹介し、PC->Arduino、Arduino->PCでの理解のための簡易なシステムを作った。今回は「通信」内容に注目し、実用的な通信を行う方法について説明する。PC内で閉じられた表現をArduinoを介して物理世界につなぐ・展開する「フィジカルコンピューティング」に期待する。• 前回資料• Lチカで終わらせないArduino シリアル通信 Part1• https://www.slideshare.net/tomit3/larduino-part1
今日の内容• 前回補足(バッファ、データ送受信について)• チェックサム 受信データが正しいか判定する• プロトコル 簡単な通信プロトコルを作る• 実例紹介(略)
前回補足(バッファ、データ送受信について)
前回• 前回のArduinoコード• 受信データがあったら、読みとり処理を行う1バイトの解釈(’a’か’b’など)なら問題無し。• コード上のシリアル通信API(関数)• Serial.available()• 受信バッファにデータがあるかどうかを返す。• Serial.read()• 受信バッファの先頭1バイトを返す。無ければ-1を返す。void loop() {while (Serial.available() > 0){byte InputData = Serial.read();//receveswitch (InputData){case 'a’ ://略break;case 'b’ ://略break;default ://略break;}}}
loop()はここを繰り返していた
前回• 前回のArduinoコード• 受信データがあったら、読みとり処理を行う1バイトの解釈(’a’か’b’など)なら問題無し。• コード上のシリアル通信API(関数)• Serial.available()• 受信バッファにデータがあるかどうかを返す。• Serial.read()• 受信バッファの先頭1バイトを返す。無ければ-1を返す。• 気になる事• 受信バッファとは?• 先頭1バイトしか読まない?複数バイトは?void loop() {while (Serial.available() > 0){byte InputData = Serial.read();//receveswitch (InputData){case 'a’ ://略break;case 'b’ ://略break;default ://略break;}}}
受信バッファとは• 送信されたデータは受信しないと消える。• イメージとしては水とバケツ。一定量ためるバケツ=バッファ• 送信されたデータは受信バッファにデータを貯める• Arduino UNOは送信用バッファ、送信用バッファに64バイト確保• バッファがあふれた場合上書きされる• バッファをあふれないようにデータを読み込む必要がある• バッファが無いと常に監視・取得する必要があることになる• 受信バッファは「FIFO」というキュー構造で保存• 先に入れたデータは最初に取り出す。受信の順番が維持される• Searil.read()はバッファから1バイト毎に取り出す(=1バイト毎にバッファから削除)
シリアル通信…0番目1番目63番目シリアル通信受信バッファFIFO(First In First Out 先入れ先出し)読み込み(メモリに転送)Arduino シリアル通信HWとSW受信バッファとは
//serial control#define BAUDRATE 9600 //9600 115200//--------------------------------------------------------------------//Setup()//--------------------------------------------------------------------void setup() {//init serialSerial.begin(BAUDRATE);}//--------------------------------------------------------------------//loop()//--------------------------------------------------------------------void loop() {//1バイト読み込むunsigned char rcv = Serial.read();//符号無しunsigned charは-1は255となるif(rcv==255){return;//何もしない。再度loop()へ。}//2進数と16進数で表示するSerial.println(rcv,BIN);Serial.println(rcv,HEX);delay(1000);}受信バッファとFIFO• 送信文字を2進数・16進数で返信• 右のコードを書き込む• シリアルモニタで文字列を送信• 改行 LFのみ• Baudrate 9600 bps• 「1」を入れて送信1
受信バッファとFIFO• 「1」を入力すると2つの出力• 1つめ目• 1行目 110001(2進数)• 2行目 31 (16進数)• 2つめ目• 1010• A ※LF:LineFeed 改行文字を意味する//--------------------------------------------------------------------//loop()//--------------------------------------------------------------------void loop() {//1バイト読み込むunsigned char rcv = Serial.read();//符号無しunsigned charは-1は255となるif(rcv==255){return;//何もしない。再度loop()へ。}//2進数と16進数で表示するSerial.println(rcv,BIN);Serial.println(rcv,HEX);delay(1000);
補足:文字1と数字1の違い• 文字の1と数字の1は異なるモノ• 文字の1はASCIIコードに基づき変換され数字で表現(0x31、10進数で49)• 数字の1は1として表現• 先ほどの例で「A」は制御文字で改行• シリアルモニタで入力した文字は、全てASCIIコードで変換され送信• 次のデモで重要なので覚えておくhttps://ja.wikipedia.org/wiki/ASCII (accessed 2021/9/20)
LF0x311[送信] 受信バッファFIFO(First In First Out)先入れ先出し↑“1”、改行文字の2バイトが受信バッファにたまる順序が維持1バイトずつ読み込み表示改行“1”1番目63番目0番目受信バッファとFIFO「1」を送信すると下記が送信・文字1・改行文字LF
受信バッファとFIFO• 「12」を送信するとLF0x320x31 0番目1番目63番目12[送信] 受信バッファFIFO(First In First Out)先入れ先出し↑“1”、”2”、改行文字の3バイトが受信バッファにたまる1バイトずつ読み込み表示改行”2”“1”
LF0x320x31 0番目1番目63番目12[送信] 受信バッファFIFO(First In First Out)先入れ先出し↑“1”、”2”、改行文字の3バイトが受信バッファにたまる順序が維持1バイトずつ読み込み表示改行”2”“1”
データの送信タイミングは不明(非同期)
データの送信タイミングは不明(非同期)受信バッファがあふれないように読む必要がある
受信バッファがあふれないように読み込む• 受信バッファがあふれないように読み込むには?①1バイトずつ読み込む• Serial.read()で「1バイトを読み込み、処理」を繰り返す。処理時間が間に合えばよい②複数バイトをまとめて読み込む• 「1バイト読み込み⇒処理⇒・・・」というのは時間がかかる。• Serial.avarable()で受信データを確認し、バッファが半分になったらSerial.read()でまとめて読み込む。効率が良い。⇒いずれも定期的にSerialのバッファサイズを確認(ポーリング)• システムの仕様(要求次第)に合わせて決めるべきところ• リアルタイムに結果が欲しい場合、プールしてよいかなど
効率よく送る(データ構造)• 例:「15」を送る。受信側は数字として扱う。• 文字で送る(シリアルモニタはこちら)• 文字を送ることになる「1」と「5」の2バイト• [0x31][0x35]を送る=1バイトを2回送信• 文字⇒数字の変換を行う。• 数字(バイト)で送る(ソフトを作る場合はこちら)• 「15」(数字)をバイト変換。1バイト• [0x0F]を送る=1バイトを1回送信• 数字をそのまま使用可能• 1回に複数送る• 数字0~15に限定可能ならば、1回でまとめておる事が可能• 1回目を上位4ビット、2回目を4ビットに割り当てて送信=1バイトを1回送信で2回分送れる0 0 0 0 0 0 0 01byte = 8 bit0 0 0 1 1 1 1 10 0 1 0 0 0 1 10x010x050 0 0 0 1 1 1 10x151 1 1 1 0 0 0 10x79↑1bit目↑8bit目1回目と2回目を1バイトに格納
まとめてデータを送受信する• 前回のArduinoコード• 受信データがあったら、読みとるというコード1バイトの解釈(’a’か’b’など)なら問題無し。• コード上のシリアル通信API(関数)• Serial.available()• 受信バッファにデータがあるかどうかを返す。• Serial.read()• 受信バッファの先頭1バイトを返す。無ければ-1を返す。• 気になる事• 受信バッファとは?• 先頭1バイトしか読まない?複数バイトは?void loop() {while (Serial.available() > 0){byte InputData = Serial.read();//receveswitch (InputData){case 'a’ ://略break;case 'b’ ://略break;default ://略break;}}}
複数バイトを送る• 複数バイトで意味を成すデータ構造の場合• 例:intは2バイト(Arduinoでは)、自作の構造体• 1バイトを超える場合(255を超える数字)エンディアンに注意• 送受信時に決めておく。複数バイトで構成されている場合に注意。• 一般的にはアーキテクチャでは気にするが、送受信で事前にルールとして決めておく• 例:256• 1バイト表現できないため2バイトで表現する• 256=0x100=0b1000000000 0 0 0 0 0 0 1 0 0 0 0 0 0 0 00 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 リトルエンディアンビッグエンディアン
複数バイトを送る• 複数バイト受信と複数バイトの解釈• 右のコードをloop()に書き込む• 2バイト送り、1バイトずつ読み込む。2バイト受信時、解釈して表示する。• 1回目の1バイトを上位、2回目の1バイトを下位とする• シリアルモニタで「12」を送信• 改行文字は無し(余計なデータのため)int rcvCount = 0;byte byte1 =0;byte byte2 =0;void loop() {//read 1byte from FIFO bufferunsigned char rcvData = Serial.read();//符号無しcharは-1は255となるif (rcvData == 255){delay(10);return;//何もしないので終わる}//受信毎に分解して解釈するif (rcvCount == 0){//1回目の1バイト受信byte1 = rcvData;//increment receve countrcvCount++;}else if (rcvCount == 1){//2回目の1バイト受信byte2 = rcvData;//上位下位をどうするか?unsigned int value = 0;//int型にデータを当てはめるvalue += byte1;value = value << 8; //8ビット 左シフトvalue += byte2;//2進数と16進数で表示するSerial.println(value, BIN);Serial.println(value, HEX);Serial.println(value);//receve count resetrcvCount = 0;}delay(10);}
0x320x31 0番目1番目63番目12[送信] 受信バッファFIFO(First In First Out)先入れ先出し2バイト読み込んだら下記の処理0x31を代入0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 00 0 0 0 0 0 0 0 0 0 1 1 0 0 0 10 0 0 0 0 0 0 08bit左シフト0x32を代入0 0 1 1 0 0 0 10 0 1 1 0 0 0 1 0 0 1 1 0 0 1 02バイト分確保//上位下位をどうするか?unsigned int value = 0;//int型にデータを当てはめるvalue += byte1;value = value << 8;value += byte2;0x3132、12594(10進数)
ここまでのまとめ• 受信データは「バッファ」にたまり定期的に取り出す• バッファがあふれないうちに読み込む• 定期的に取り出す方法は要求次第• FIFOにより順番が保持されたデータを読み出す• 複数バイトからなるデータは解釈(デシリアライズとも)する必要がある• 「受信」の話をしたが「送信」も同様のことを考える
チェックサム受信データが正しいか判定する
• 通信するときに必要な事の一部• 任意のデータを送る• 数字、文字列、データ構造• 送ったデータが「正しく」送れたか?• データを正しく送れたか/受け取れたか• データを取りこぼしなく送れたか/受け取れたか⇒受信側が判定• 例:ネットワークではTCP/IPが担保• 相手先と通信できることを事前確認(ハンドシェイク)• データを分割して送信(パケット)し、パケット毎にデータの正しさ(チェックサム、CRCなど)を確認し、間違いがあれば再送信USB「通信」するということ
受信データが正しいか判定する• 受信したデータが正しいかどうか?• 受信データだけでは正しさは分からない。ヒントが欲しい。• 送信側と受信側で同じことをして再現できる技法が良い• マイコン(MCU)は一般的に計算力が高くないため計算負荷が低いものが良い• データがおかしいと分かれば、再送依頼、破棄などの判断が行える• データの「正しさのヒント」をデータに入れ込む• チェックディジット クレジットカードの番号判定 数字の入れ替え検出• チェックサム データが正しいか判定 計算処理低• ハッシュ関数 データが正しい(本物か)か判定 計算処理高
受信データが正しいか判定する• チェックサム• 送信データを1バイト毎に加算した数字のこと• 1、2バイトetc 送るデータサイズによる。受信バッファから2バイトでもよい• 1の補数、2の補数を使うのが一般的。受信側で足せば0になるようにする。計算量低• 送信側が行う事• 送信データのチェックサムを計算• チェックサムを別途送信• 受信側で行う事• 受信データのチェックサムを計算• 受信データで計算したチェックサムと送信で計算したチェックサムを比較
・・・・・・0x320x31 0番目1番目63番目受信バッファFIFO(First In First Out)先入れ先出し送信データ 10進数1byte 1 492byte 2 503byte 3 514byte 4 525byte 5 536byte 6 547byte 7 558byte a 97チェックサム int 461(チェックサム byte 205)受信データ 10進数1byte 1 492byte 2 503byte 3 514byte 4 525byte 5 536byte 6 547byte 7 558byte a 97PC(送信) Arduino(受信)送信側で計算したチェックサム受信側で計算したチェックサムを比較する チェックサム int 461(チェックサム byte 205)
unsigned char rcvCount = 0;unsigned int checkSum = 0;//--------------------------------------------------------------------//loop()//--------------------------------------------------------------------void loop() {//read 1byte from FIFO bufferunsigned char rcvData = Serial.read();//符号無しcharは-1は255となるif (rcvData == 255){delay(10);return;//何もしないので終わる}//チェックサム計算checkSum += rcvData;//受信毎に分解して解釈するif (rcvCount == 5){if (checkSum == 309){//チェックサム一致=データが正しいSerial.println("data correct!");}else{//チェックサム不一致=データが正しいSerial.println("data incorrect!");}//receve count resetrcvCount = 0;checkSum = 0;//バッファクリアSerial.flush();}else{//increment receve countrcvCount++;}delay(10);}• チェックサムの確認• 左コードを書き込む。• 6文字受信した時のチェックサムを計算して結果を出力• チェックサム「309」をハードコーディングチェックサムが309は正常、それ以外は異常と出力• 実験 下記を入力• シリアルモニタ(改行無し)で6文字送信• 123456• 正常 ⇒ OK• 112345• 異常 ⇒ 異なるデータが入ったことを検出• 654321• 正常 ⇒ チェックサムは順番違いは検出できない
文字列 10進数1byte 1 492byte 2 503byte 3 514byte 4 525byte 5 536byte 6 541度に送るデータを加算チェックサム 309文字列 10進数1byte 1 492byte 2 503byte 3 514byte 4 525byte 5 536byte 6 54受信データを加算チェックサム 309受信データの確認=チェックサムの比較同一であればデータが送られたときと同じ可能性が高い注意:例では値を固定したが、送信データが変わるとチェックサムも変わる送信側は送信データとチェックサムをまとめて送るようにする
プロトコル簡単な通信プロトコルを作る
通信ルール=プロトコルを作る• 受信データの「境界」が不明• どこがチェックサム、どこが実データか?送信・受信側で事前に決める• どんなデータ構造を?• どう送るのか?• 作成したプロトコル1. 送るデータをまとまり(パケット)で送る。• パケットの構造は下記で構成• ヘッダー部• チェックサム、(ここに送信サイズもある)• データ部(ボディ・ペイロード と呼ばれる)• 1回に送る実データ(任意データ構造)2. 1度に送るデータはヘッダー+データで10バイト固定ヘッダーチェックサムデータ2バイト8バイト1回に下記パケットを送る⇒プロトコル
ペイロード(送るデータ) ペイロード(送るデータ)ヘッダー送るサイズペイロード(送るデータ)プロトコル• 1度に送るデータはNバイト固定問題1. バッファがオーバーして1バイト欠損したとき受信側は待機し続ける必要がある。⇒タイムアウトの実装など2. 受信中にノイズがあった受信データが正しいかどうか?⇒データの正当性確認プロトコル• 1度に送るデータは可変長• ヘッダーに送るサイズを付与問題1. バッファがオーバーして1バイト欠損したとき受信側は待機し続ける必要がある。⇒タイムアウトの実装など2. 受信中にノイズがあった受信データが正しいかどうか?⇒データの正当性確認プロトコル• 1度に送るデータはNバイト固定• チェックサムを付加(誤り訂正符号)問題1. バッファがオーバーして1バイト欠損したとき受信側は待機し続ける必要がある。⇒タイムアウトの実装などヘッダー誤り訂正符号いろんなプロトコル
通信ルール=プロトコルを作る• シリアルモニタでデータを送るのは難しいので解説• 前のプロトコルに従いデータを受信して、整合性確認1byte 12byte 2053byte 494byte 505byte 516byte 527byte 538byte 549byte 5510byte 97文字列 10進数1byte 1 492byte 2 503byte 3 514byte 4 525byte 5 536byte 6 547byte 7 558byte a 97チェックサム 461パケットに変換 1byte 12byte 2053byte 494byte 505byte 516byte 527byte 538byte 549byte 5510byte 97チェックサムデータ部
#define RCV_SIZE 10#define RCV_LOOP 10byte rcvData[RCV_SIZE];//--------------------------------------------------------------------//loop()//--------------------------------------------------------------------void loop() {//シリアル通信で1パケット受信//データがあった=欲しいデータが送信中/されたとするif (Serial.available() > 0){//受信データ変数クリアmemset(rcvData, 0, RCV_SIZE);//RCV_LOOP分がデータ受信待ちなどの待機≒タイムアウトunsigned int chkSumRcv = 0;int readCount = 0;for (int i = 0; i < RCV_LOOP; i++){//wait 9600 bit/s=1200 byte/s->10 byteは8.3ms相当で貯まるはずdelay(5);//readunsigned int canReadSize = Serial.available();if (canReadSize <= 0){continue;}else if (canReadSize > 0){//バッファにあるデータを1バイトずつ読み込むfor (int i = 0; i < canReadSize; i++){byte temp = Serial.read();rcvData[readCount] = temp;//先頭2バイトはチェックサム計算しないif (readCount >= 2){chkSumRcv += temp;}readCount++;}//指定サイズを読み込んだ時ループを脱するif (readCount == RCV_SIZE){break;}}}//受信データのチェックサム確認unsigned int chkSumFromRcvData = (rcvData[0]<<8) | rcvData[1];if ( chkSumRcv == chkSumFromRcvData){Serial.println("OK");}else{Serial.println("Fail");}}delay(1);}
実際に何に使った?• デモ
まとめ• ArduinoとPCの通信を中心に• Arduinoの基本的な使い方とシリアル通信の基本的な概要• 複数バイト、バッファの考え、チェックサム• 互いのHWの通信のためのプロトコル作り• パケット、データ正当性• 省略したこと• PCの送受信(UIスレッドではなく、別スレッドでポーリングすべきetc)• 再送信• HWのハンドシェイク(複数のCOMのHWでは機器区別が可能)• 送受信が必要。「HELLO ⇒ HELLO」と返すなどでもOK。
アプリケーション層プレゼンテーション層セッション層トランスポート層ネットワーク層データリンク層物理層デバイス同士で通信をするために定義(作る)する必要がある232Cの物理的な規格RX/TX、UART差動etc232Cの通信プロトコル(データリンク層かは議論があるかも)データビットetcUSBPC<-Serial通信->ArduinoにおけるOSI参照モデル・パケットにして送る・1度に送るデータサイズ・データの整合性:チェックサム
補足
補足:バッファサイズを拡張したい方向け下記コード変更して、ATMEGA328Pに書き込む¥arduino-1.x.x¥hardware¥arduino¥avr¥cores¥ArduinoHardwareSerial_private.h#if !defined(SERIAL_TX_BUFFER_SIZE)#if ((RAMEND - RAMSTART) < 1023)#define SERIAL_TX_BUFFER_SIZE 16#else#define SERIAL_TX_BUFFER_SIZE 64#endif#endif#if !defined(SERIAL_RX_BUFFER_SIZE)#if ((RAMEND - RAMSTART) < 1023)#define SERIAL_RX_BUFFER_SIZE 16#else#define SERIAL_RX_BUFFER_SIZE 64#endif#endif#if (SERIAL_TX_BUFFER_SIZE>256)typedef uint16_t tx_buffer_index_t;#elsetypedef uint8_t tx_buffer_index_t;#endif#if (SERIAL_RX_BUFFER_SIZE>256)typedef uint16_t rx_buffer_index_t;#elsetypedef uint8_t rx_buffer_index_t;#endif・サイズSERIAL_TX_BUFFER_SIZESERIAL_RX_BUFFER_SIZEがそれぞれ送受信バッファサイズ。デフォルトは64となる(MCUのメモリサイズが1023バイト以下は16)・ポイント1.リングバッファのため、2^nのサイズにするのが望ましい。2.「256」より大きくするとアトミック性ガード(Atomicity?)を実装しないため不安定になるとのこと。ATMEGA 328P用にコンパイルして書き込む必要がある。
補足:available()とread()• 1関数呼び出し時のコスト• 下記は受信バッファ0の時の時間を計測• Searial.available()1.72 us• Searil.read() 1.52 us※Arduino クロック周波数 16Mhz。AVR 1命令1クロック処理。1命令=0.0625 us。25クロック• 0.2usほどread()の方が早い。read()を多用しようではなく、メモリ転送や処理も考慮するとまとめてデータを呼び出したほうがよい。
補足• Arduinoと通信できると何かと便利• センサーなどはArduino、M5で使える実装がほぼ公開• PCから見るとそのセンサーを直接知らなくてもよい。物理的な接続、HWとの通信プロトコルはArduinoが吸収。これが良い。(前回から「中間」、「仲介」といっていたのはこのこと)• 通信さえできればArduinoの実装済みコードを使って手軽に用いて、そのデータを簡単に取得できる。何かのHWI2C?SPI?SerialPCから見るとArduino先は知らなくてもよい。
補足• 中間HWとしてのArduino• HWの中間・仲介役として優秀なArduino• M5シリーズとArduinoの実装例が豊富(ユーザー数が多いからと推測)• PC⇒HW• 電気的な仕組みはクリアしたとして、電圧値値読み込むためのA/D変換IDとの通信、SPI、I2Cプロトコルでの通信・・・があるが• Arduinoは前述の実装コードが多数公開されているのでここを簡略化できる

Recommended

PDF
Arduinoで遊ぼう #1Processingと連携する
PDF
Bluetooth通信の 仕組みと活用法紹介
PPTX
Arduino 入門
PPTX
Lチカで終わらせないArduino シリアル通信 Part1(移行済)
PDF
Arduino + rcs620sで遊ぼう
 
PDF
3台以上のarduinoでのspi通信 2017 07-20
PPTX
平成26年度熊本高専Arduino講座 第2週 XBeeを用いた遠隔放射線量計測
PDF
I2CでRaspberry Piから 複数の周辺機器を制御する
PPT
平成26年度熊本高専Arduino講座 第1週 センサーとArduno及びProcessingとの連携
PPTX
イチからはじめるUSB Host API
PDF
Arduinoでプログラミングに触れてみよう 続編
PDF
プログラムによる計測と制御の仕組みを学ぶための学習支援ソフトウェア (ポスター)
PDF
プログラムによる計測と制御の仕組みを学ぶための学習支援ソフトウェア
PDF
SFC デザイン言語WS(電子工作)第6回「PCとの連携・音」
PDF
Arduino用3gシールドの開発と教育への実践(天良先生)
PDF
【学習メモ#4th】12ステップで作る組込みOS自作入門
 
PDF
第5回電子制御講習
PDF
2016年11月19日 AITCシニア技術者勉強会 第1回「Arduinoを使ってみる」
ODP
【入門】Arduino勉強会
PDF
Node.jsとXBeeで電気回路を無線制御
PDF
第1回電子制御講習
PDF
Make: Ogaki Meeting 2012 Androidロボットサミットin大垣
PPTX
Androidとfpgaを高速fifo通信させちゃう
PDF
Arduinoをこれから始める人のためのArduino紹介スライドβ版
PDF
ものづくりプロジェクトII 一日でわかるArduino入門
KEY
プロペラブForth発表osc愛媛
 
PPTX
2015/05/23 シニア技術者プログラム第3弾 「第二回IoT勉強会&交流会」 15:00~15:20 Arduinoで簡単回路作成実演
PDF
Make @ Osaka
PPTX
ChatGPTでモノづくりを支援してもらった話(移行済)
PPTX
ちょっと使えるようになる信頼度成長曲線(移行済)

More Related Content

PDF
Arduinoで遊ぼう #1Processingと連携する
PDF
Bluetooth通信の 仕組みと活用法紹介
PPTX
Arduino 入門
PPTX
Lチカで終わらせないArduino シリアル通信 Part1(移行済)
PDF
Arduino + rcs620sで遊ぼう
 
PDF
3台以上のarduinoでのspi通信 2017 07-20
PPTX
平成26年度熊本高専Arduino講座 第2週 XBeeを用いた遠隔放射線量計測
PDF
I2CでRaspberry Piから 複数の周辺機器を制御する
Arduinoで遊ぼう #1Processingと連携する
Bluetooth通信の 仕組みと活用法紹介
Arduino 入門
Lチカで終わらせないArduino シリアル通信 Part1(移行済)
Arduino + rcs620sで遊ぼう
 
3台以上のarduinoでのspi通信 2017 07-20
平成26年度熊本高専Arduino講座 第2週 XBeeを用いた遠隔放射線量計測
I2CでRaspberry Piから 複数の周辺機器を制御する

Similar to Lチカで終わらせないArduino シリアル通信 Part2(移行済)

PPT
平成26年度熊本高専Arduino講座 第1週 センサーとArduno及びProcessingとの連携
PPTX
イチからはじめるUSB Host API
PDF
Arduinoでプログラミングに触れてみよう 続編
PDF
プログラムによる計測と制御の仕組みを学ぶための学習支援ソフトウェア (ポスター)
PDF
プログラムによる計測と制御の仕組みを学ぶための学習支援ソフトウェア
PDF
SFC デザイン言語WS(電子工作)第6回「PCとの連携・音」
PDF
Arduino用3gシールドの開発と教育への実践(天良先生)
PDF
【学習メモ#4th】12ステップで作る組込みOS自作入門
 
PDF
第5回電子制御講習
PDF
2016年11月19日 AITCシニア技術者勉強会 第1回「Arduinoを使ってみる」
ODP
【入門】Arduino勉強会
PDF
Node.jsとXBeeで電気回路を無線制御
PDF
第1回電子制御講習
PDF
Make: Ogaki Meeting 2012 Androidロボットサミットin大垣
PPTX
Androidとfpgaを高速fifo通信させちゃう
PDF
Arduinoをこれから始める人のためのArduino紹介スライドβ版
PDF
ものづくりプロジェクトII 一日でわかるArduino入門
KEY
プロペラブForth発表osc愛媛
 
PPTX
2015/05/23 シニア技術者プログラム第3弾 「第二回IoT勉強会&交流会」 15:00~15:20 Arduinoで簡単回路作成実演
PDF
Make @ Osaka
平成26年度熊本高専Arduino講座 第1週 センサーとArduno及びProcessingとの連携
イチからはじめるUSB Host API
Arduinoでプログラミングに触れてみよう 続編
プログラムによる計測と制御の仕組みを学ぶための学習支援ソフトウェア (ポスター)
プログラムによる計測と制御の仕組みを学ぶための学習支援ソフトウェア
SFC デザイン言語WS(電子工作)第6回「PCとの連携・音」
Arduino用3gシールドの開発と教育への実践(天良先生)
【学習メモ#4th】12ステップで作る組込みOS自作入門
 
第5回電子制御講習
2016年11月19日 AITCシニア技術者勉強会 第1回「Arduinoを使ってみる」
【入門】Arduino勉強会
Node.jsとXBeeで電気回路を無線制御
第1回電子制御講習
Make: Ogaki Meeting 2012 Androidロボットサミットin大垣
Androidとfpgaを高速fifo通信させちゃう
Arduinoをこれから始める人のためのArduino紹介スライドβ版
ものづくりプロジェクトII 一日でわかるArduino入門
プロペラブForth発表osc愛媛
 
2015/05/23 シニア技術者プログラム第3弾 「第二回IoT勉強会&交流会」 15:00~15:20 Arduinoで簡単回路作成実演
Make @ Osaka

More from tomitomi3 tomitomi3

PPTX
ChatGPTでモノづくりを支援してもらった話(移行済)
PPTX
ちょっと使えるようになる信頼度成長曲線(移行済)
PPTX
開発環境構築からはじめるPython VisualStudio Codeとpipenvで始めるpython
PPTX
M5StickC M5StickVを使った簡易監視装置を作ってみる
PPTX
第14回 KAIM M5StickV(K210)をDNNアクセラレータとして使おうとした試み
PPTX
第13回 KAIM 金沢人工知能勉強会 混合した信号を分解する視点からみる主成分分析
PPTX
第11回 KAIM 金沢人工知能勉強会 改めて機械学習を広く浅く知る
PPTX
第9回 KAIM 金沢人工知能勉強会 進化的計算と最適化 / Evolutionary computation and optimization(移行済)
PPTX
第7回 KAIM 金沢人工知能勉強会 回帰分析と使う上での注意事項
PPTX
第6回 KAIM 金沢人工知能勉強会 人工知能を知るために脳を知る
PPTX
A history of neuro brain imaging
ChatGPTでモノづくりを支援してもらった話(移行済)
ちょっと使えるようになる信頼度成長曲線(移行済)
開発環境構築からはじめるPython VisualStudio Codeとpipenvで始めるpython
M5StickC M5StickVを使った簡易監視装置を作ってみる
第14回 KAIM M5StickV(K210)をDNNアクセラレータとして使おうとした試み
第13回 KAIM 金沢人工知能勉強会 混合した信号を分解する視点からみる主成分分析
第11回 KAIM 金沢人工知能勉強会 改めて機械学習を広く浅く知る
第9回 KAIM 金沢人工知能勉強会 進化的計算と最適化 / Evolutionary computation and optimization(移行済)
第7回 KAIM 金沢人工知能勉強会 回帰分析と使う上での注意事項
第6回 KAIM 金沢人工知能勉強会 人工知能を知るために脳を知る
A history of neuro brain imaging

Lチカで終わらせないArduino シリアル通信 Part2(移行済)


[8]ページ先頭

©2009-2025 Movatter.jp