SlideShare a Scribd company logo
1 of 45
続・Lチカで終わらせないArduino
20210921初版
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();
//receve
switch (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();
//receve
switch (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 serial
Serial.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)
LF
0x31
1[送信] 受信バッファ
FIFO(First In First Out)
先入れ先出し
↑
“1”、改行文字の
2バイトが受信バッファにたまる
順序が維持
1バイトずつ読み込み表示
改行
“1”
1番目
63番目
0番目
受信バッファとFIFO
「1」を送信すると下記が送信
・文字1
・改行文字LF
受信バッファとFIFO
• 「12」を送信すると
LF
0x32
0x31 0番目
1番目
63番目
12[送信] 受信バッファ
FIFO(First In First Out)
先入れ先出し
↑
“1”、”2”、改行文字の
3バイトが受信バッファにたまる
1バイトずつ読み込み表示
改行
”2”
“1”
LF
0x32
0x31 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 0
1byte = 8 bit
0 0 0 1 1 1 1 1
0 0 1 0 0 0 1 1
0x01
0x05
0 0 0 0 1 1 1 1
0x15
1 1 1 1 0 0 0 1
0x79
↑
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();
//receve
switch (InputData)
{
case 'a’ :
//略
break;
case 'b’ :
//略
break;
default :
//略
break;
}
}
}
複数バイトを送る
• 複数バイトで意味を成すデータ構造の場合
• 例:intは2バイト(Arduinoでは)、自作の構造体
• 1バイトを超える場合(255を超える数字)エンディアンに注意
• 送受信時に決めておく。複数バイトで構成されている場合に注意。
• 一般的にはアーキテクチャでは気にするが、送受信で事前にルールとして決めておく
• 例:256
• 1バイト表現できないため2バイトで表現する
• 256=0x100=0b100000000
0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0
0 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 buffer
unsigned char rcvData = Serial.read();
//符号無しcharは-1は255となる
if (rcvData == 255)
{
delay(10);
return;//何もしないので終わる
}
//受信毎に分解して解釈する
if (rcvCount == 0)
{
//1回目の1バイト受信
byte1 = rcvData;
//increment receve count
rcvCount++;
}
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 reset
rcvCount = 0;
}
delay(10);
}
0x32
0x31 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 0
0 0 0 0 0 0 0 0 0 0 1 1 0 0 0 1
0 0 0 0 0 0 0 0
8bit左シフト
0x32を代入
0 0 1 1 0 0 0 1
0 0 1 1 0 0 0 1 0 0 1 1 0 0 1 0
2バイト分確保
//上位下位をどうするか?
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になるようにする。計算量低
• 送信側が行う事
• 送信データのチェックサムを計算
• チェックサムを別途送信
• 受信側で行う事
• 受信データのチェックサムを計算
• 受信データで計算したチェックサムと送信で計算したチェックサムを比較
・・・
・・・
0x32
0x31 0番目
1番目
63番目
受信バッファ
FIFO(First In First Out)
先入れ先出し
送信データ 10進数
1byte 1 49
2byte 2 50
3byte 3 51
4byte 4 52
5byte 5 53
6byte 6 54
7byte 7 55
8byte a 97
チェックサム int 461
(チェックサム byte 205)
受信データ 10進数
1byte 1 49
2byte 2 50
3byte 3 51
4byte 4 52
5byte 5 53
6byte 6 54
7byte 7 55
8byte a 97
PC(送信) Arduino(受信)
送信側で計算したチェックサム
受信側で計算したチェックサム
を比較する チェックサム int 461
(チェックサム byte 205)
unsigned char rcvCount = 0;
unsigned int checkSum = 0;
//-------------------------------------------------------------
-------
//loop()
//-------------------------------------------------------------
-------
void loop() {
//read 1byte from FIFO buffer
unsigned 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 reset
rcvCount = 0;
checkSum = 0;
//バッファクリア
Serial.flush();
}
else
{
//increment receve count
rcvCount++;
}
delay(10);
}
• チェックサムの確認
• 左コードを書き込む。
• 6文字受信した時のチェックサムを計算して結果を出力
• チェックサム「309」をハードコーディング
チェックサムが309は正常、それ以外は異常と出力
• 実験 下記を入力
• シリアルモニタ(改行無し)で6文字送信
• 123456
• 正常 ⇒ OK
• 112345
• 異常 ⇒ 異なるデータが入ったことを検出
• 654321
• 正常 ⇒ チェックサムは順番違いは検出できない
文字列 10進数
1byte 1 49
2byte 2 50
3byte 3 51
4byte 4 52
5byte 5 53
6byte 6 54
1度に送るデータを加算
チェックサム 309
文字列 10進数
1byte 1 49
2byte 2 50
3byte 3 51
4byte 4 52
5byte 5 53
6byte 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 1
2byte 205
3byte 49
4byte 50
5byte 51
6byte 52
7byte 53
8byte 54
9byte 55
10byte 97
文字列 10進数
1byte 1 49
2byte 2 50
3byte 3 51
4byte 4 52
5byte 5 53
6byte 6 54
7byte 7 55
8byte a 97
チェックサム 461
パケットに変換 1byte 1
2byte 205
3byte 49
4byte 50
5byte 51
6byte 52
7byte 53
8byte 54
9byte 55
10byte 97
チェックサム
データ部
#define RCV_SIZE 10
#define RCV_LOOP 10
byte 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);
//read
unsigned 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
差動etc
232Cの通信プロトコル(データリンク層かは議論があるかも)
データビットetc
USB
PC<-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;
#else
typedef uint8_t tx_buffer_index_t;
#endif
#if (SERIAL_RX_BUFFER_SIZE>256)
typedef uint16_t rx_buffer_index_t;
#else
typedef uint8_t rx_buffer_index_t;
#endif
・サイズ
SERIAL_TX_BUFFER_SIZE
SERIAL_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の実装済みコードを使って手軽に用いて、そのデータを簡
単に取得できる。
何かのHW
I2C?
SPI?
Serial
PCから見るとArduino先は知らなくてもよい。
補足
• 中間HWとしてのArduino
• HWの中間・仲介役として優秀なArduino
• M5シリーズとArduinoの実装例が豊富(ユーザー数が多いからと推測)
• PC⇒HW
• 電気的な仕組みはクリアしたとして、電圧値値読み込むためのA/D変換IDとの通信、
SPI、I2Cプロトコルでの通信・・・があるが
• Arduinoは前述の実装コードが多数公開されているのでここを簡略化できる

More Related Content

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

Hokkaido.cap#3 ケーススタディ(基礎編)
Hokkaido.cap#3 ケーススタディ(基礎編)Hokkaido.cap#3 ケーススタディ(基礎編)
Hokkaido.cap#3 ケーススタディ(基礎編)Panda Yamaki
 
ラズパイでネット対応 学習リモコンをつくろう!
ラズパイでネット対応 学習リモコンをつくろう!ラズパイでネット対応 学習リモコンをつくろう!
ラズパイでネット対応 学習リモコンをつくろう!Masayuki KaToH
 
ネットワークの紹介+苦労話
ネットワークの紹介+苦労話ネットワークの紹介+苦労話
ネットワークの紹介+苦労話Tetsuya Hasegawa
 
Ossで作成するチーム開発環境
Ossで作成するチーム開発環境Ossで作成するチーム開発環境
Ossで作成するチーム開発環境Tadahiro Ishisaka
 
Stan勉強会資料(前編)
Stan勉強会資料(前編) Stan勉強会資料(前編)
Stan勉強会資料(前編) daiki hojo
 
EmbulkとDigdagとデータ分析基盤と
EmbulkとDigdagとデータ分析基盤とEmbulkとDigdagとデータ分析基盤と
EmbulkとDigdagとデータ分析基盤とToru Takahashi
 
EmbulkとDigdagとデータ分析基盤と
EmbulkとDigdagとデータ分析基盤とEmbulkとDigdagとデータ分析基盤と
EmbulkとDigdagとデータ分析基盤とToru Takahashi
 
Arduinoで遊ぼう #1Processingと連携する
Arduinoで遊ぼう #1Processingと連携するArduinoで遊ぼう #1Processingと連携する
Arduinoで遊ぼう #1Processingと連携するYasunori Sannomiya
 
Mono is Dead
Mono is DeadMono is Dead
Mono is Deadmelpon
 
Bluetooth Low Energy入門講座 -part2
Bluetooth Low Energy入門講座 -part2Bluetooth Low Energy入門講座 -part2
Bluetooth Low Energy入門講座 -part2edy555
 
Imprementation of realtime_networkgame
Imprementation of realtime_networkgameImprementation of realtime_networkgame
Imprementation of realtime_networkgameSatoshi Yamafuji
 
Washingtondc b20161214 (2/3)
Washingtondc b20161214 (2/3)Washingtondc b20161214 (2/3)
Washingtondc b20161214 (2/3)Toshiyuki Shimono
 
Hokkaido.cap#5 ケーススタディ(ネットワークの遅延と戦う:後編)
Hokkaido.cap#5 ケーススタディ(ネットワークの遅延と戦う:後編)Hokkaido.cap#5 ケーススタディ(ネットワークの遅延と戦う:後編)
Hokkaido.cap#5 ケーススタディ(ネットワークの遅延と戦う:後編)Panda Yamaki
 
2012/06/28 #ssmjp
2012/06/28 #ssmjp2012/06/28 #ssmjp
2012/06/28 #ssmjpth0x0472
 
CTF for ビギナーズ ネットワーク講習資料
CTF for ビギナーズ ネットワーク講習資料CTF for ビギナーズ ネットワーク講習資料
CTF for ビギナーズ ネットワーク講習資料SECCON Beginners
 

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

Hokkaido.cap#3 ケーススタディ(基礎編)
Hokkaido.cap#3 ケーススタディ(基礎編)Hokkaido.cap#3 ケーススタディ(基礎編)
Hokkaido.cap#3 ケーススタディ(基礎編)
 
ラズパイでネット対応 学習リモコンをつくろう!
ラズパイでネット対応 学習リモコンをつくろう!ラズパイでネット対応 学習リモコンをつくろう!
ラズパイでネット対応 学習リモコンをつくろう!
 
NW入門
NW入門NW入門
NW入門
 
ネットワークの紹介+苦労話
ネットワークの紹介+苦労話ネットワークの紹介+苦労話
ネットワークの紹介+苦労話
 
20060520.tcp
20060520.tcp20060520.tcp
20060520.tcp
 
Ossで作成するチーム開発環境
Ossで作成するチーム開発環境Ossで作成するチーム開発環境
Ossで作成するチーム開発環境
 
KOGEI & KAIT Funnel WS
KOGEI & KAIT Funnel WSKOGEI & KAIT Funnel WS
KOGEI & KAIT Funnel WS
 
Stan勉強会資料(前編)
Stan勉強会資料(前編) Stan勉強会資料(前編)
Stan勉強会資料(前編)
 
私とOSSの25年
私とOSSの25年私とOSSの25年
私とOSSの25年
 
Mmo game networking_1
Mmo game networking_1Mmo game networking_1
Mmo game networking_1
 
EmbulkとDigdagとデータ分析基盤と
EmbulkとDigdagとデータ分析基盤とEmbulkとDigdagとデータ分析基盤と
EmbulkとDigdagとデータ分析基盤と
 
EmbulkとDigdagとデータ分析基盤と
EmbulkとDigdagとデータ分析基盤とEmbulkとDigdagとデータ分析基盤と
EmbulkとDigdagとデータ分析基盤と
 
Arduinoで遊ぼう #1Processingと連携する
Arduinoで遊ぼう #1Processingと連携するArduinoで遊ぼう #1Processingと連携する
Arduinoで遊ぼう #1Processingと連携する
 
Mono is Dead
Mono is DeadMono is Dead
Mono is Dead
 
Bluetooth Low Energy入門講座 -part2
Bluetooth Low Energy入門講座 -part2Bluetooth Low Energy入門講座 -part2
Bluetooth Low Energy入門講座 -part2
 
Imprementation of realtime_networkgame
Imprementation of realtime_networkgameImprementation of realtime_networkgame
Imprementation of realtime_networkgame
 
Washingtondc b20161214 (2/3)
Washingtondc b20161214 (2/3)Washingtondc b20161214 (2/3)
Washingtondc b20161214 (2/3)
 
Hokkaido.cap#5 ケーススタディ(ネットワークの遅延と戦う:後編)
Hokkaido.cap#5 ケーススタディ(ネットワークの遅延と戦う:後編)Hokkaido.cap#5 ケーススタディ(ネットワークの遅延と戦う:後編)
Hokkaido.cap#5 ケーススタディ(ネットワークの遅延と戦う:後編)
 
2012/06/28 #ssmjp
2012/06/28 #ssmjp2012/06/28 #ssmjp
2012/06/28 #ssmjp
 
CTF for ビギナーズ ネットワーク講習資料
CTF for ビギナーズ ネットワーク講習資料CTF for ビギナーズ ネットワーク講習資料
CTF for ビギナーズ ネットワーク講習資料
 

More from tomitomi3 tomitomi3

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

More from tomitomi3 tomitomi3 (11)

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

Recently uploaded

クラウドネイティブなサーバー仮想化基盤 - OpenShift Virtualization.pdf
クラウドネイティブなサーバー仮想化基盤 - OpenShift Virtualization.pdfクラウドネイティブなサーバー仮想化基盤 - OpenShift Virtualization.pdf
クラウドネイティブなサーバー仮想化基盤 - OpenShift Virtualization.pdfFumieNakayama
 
論文紹介:Automated Classification of Model Errors on ImageNet
論文紹介:Automated Classification of Model Errors on ImageNet論文紹介:Automated Classification of Model Errors on ImageNet
論文紹介:Automated Classification of Model Errors on ImageNetToru Tamaki
 
モーダル間の変換後の一致性とジャンル表を用いた解釈可能性の考察 ~Text-to-MusicとText-To-ImageかつImage-to-Music...
モーダル間の変換後の一致性とジャンル表を用いた解釈可能性の考察  ~Text-to-MusicとText-To-ImageかつImage-to-Music...モーダル間の変換後の一致性とジャンル表を用いた解釈可能性の考察  ~Text-to-MusicとText-To-ImageかつImage-to-Music...
モーダル間の変換後の一致性とジャンル表を用いた解釈可能性の考察 ~Text-to-MusicとText-To-ImageかつImage-to-Music...博三 太田
 
論文紹介:Semantic segmentation using Vision Transformers: A survey
論文紹介:Semantic segmentation using Vision Transformers: A survey論文紹介:Semantic segmentation using Vision Transformers: A survey
論文紹介:Semantic segmentation using Vision Transformers: A surveyToru Tamaki
 
CTO, VPoE, テックリードなどリーダーポジションに登用したくなるのはどんな人材か?
CTO, VPoE, テックリードなどリーダーポジションに登用したくなるのはどんな人材か?CTO, VPoE, テックリードなどリーダーポジションに登用したくなるのはどんな人材か?
CTO, VPoE, テックリードなどリーダーポジションに登用したくなるのはどんな人材か?akihisamiyanaga1
 
Open Source UN-Conference 2024 Kawagoe - 独自OS「DaisyOS GB」の紹介
Open Source UN-Conference 2024 Kawagoe - 独自OS「DaisyOS GB」の紹介Open Source UN-Conference 2024 Kawagoe - 独自OS「DaisyOS GB」の紹介
Open Source UN-Conference 2024 Kawagoe - 独自OS「DaisyOS GB」の紹介Yuma Ohgami
 
TataPixel: 畳の異方性を利用した切り替え可能なディスプレイの提案
TataPixel: 畳の異方性を利用した切り替え可能なディスプレイの提案TataPixel: 畳の異方性を利用した切り替え可能なディスプレイの提案
TataPixel: 畳の異方性を利用した切り替え可能なディスプレイの提案sugiuralab
 
デジタル・フォレンジックの最新動向(2024年4月27日情洛会総会特別講演スライド)
デジタル・フォレンジックの最新動向(2024年4月27日情洛会総会特別講演スライド)デジタル・フォレンジックの最新動向(2024年4月27日情洛会総会特別講演スライド)
デジタル・フォレンジックの最新動向(2024年4月27日情洛会総会特別講演スライド)UEHARA, Tetsutaro
 
論文紹介:Content-Aware Token Sharing for Efficient Semantic Segmentation With Vis...
論文紹介:Content-Aware Token Sharing for Efficient Semantic Segmentation With Vis...論文紹介:Content-Aware Token Sharing for Efficient Semantic Segmentation With Vis...
論文紹介:Content-Aware Token Sharing for Efficient Semantic Segmentation With Vis...Toru Tamaki
 
自分史上一番早い2024振り返り〜コロナ後、仕事は通常ペースに戻ったか〜 by IoT fullstack engineer
自分史上一番早い2024振り返り〜コロナ後、仕事は通常ペースに戻ったか〜 by IoT fullstack engineer自分史上一番早い2024振り返り〜コロナ後、仕事は通常ペースに戻ったか〜 by IoT fullstack engineer
自分史上一番早い2024振り返り〜コロナ後、仕事は通常ペースに戻ったか〜 by IoT fullstack engineerYuki Kikuchi
 
AWS の OpenShift サービス (ROSA) を使った OpenShift Virtualizationの始め方.pdf
AWS の OpenShift サービス (ROSA) を使った OpenShift Virtualizationの始め方.pdfAWS の OpenShift サービス (ROSA) を使った OpenShift Virtualizationの始め方.pdf
AWS の OpenShift サービス (ROSA) を使った OpenShift Virtualizationの始め方.pdfFumieNakayama
 
【早稲田AI研究会 講義資料】3DスキャンとTextTo3Dのツールを知ろう!(Vol.1)
【早稲田AI研究会 講義資料】3DスキャンとTextTo3Dのツールを知ろう!(Vol.1)【早稲田AI研究会 講義資料】3DスキャンとTextTo3Dのツールを知ろう!(Vol.1)
【早稲田AI研究会 講義資料】3DスキャンとTextTo3Dのツールを知ろう!(Vol.1)Hiroki Ichikura
 
SOPを理解する 2024/04/19 の勉強会で発表されたものです
SOPを理解する       2024/04/19 の勉強会で発表されたものですSOPを理解する       2024/04/19 の勉強会で発表されたものです
SOPを理解する 2024/04/19 の勉強会で発表されたものですiPride Co., Ltd.
 
TSAL operation mechanism and circuit diagram.pdf
TSAL operation mechanism and circuit diagram.pdfTSAL operation mechanism and circuit diagram.pdf
TSAL operation mechanism and circuit diagram.pdftaisei2219
 

Recently uploaded (14)

クラウドネイティブなサーバー仮想化基盤 - OpenShift Virtualization.pdf
クラウドネイティブなサーバー仮想化基盤 - OpenShift Virtualization.pdfクラウドネイティブなサーバー仮想化基盤 - OpenShift Virtualization.pdf
クラウドネイティブなサーバー仮想化基盤 - OpenShift Virtualization.pdf
 
論文紹介:Automated Classification of Model Errors on ImageNet
論文紹介:Automated Classification of Model Errors on ImageNet論文紹介:Automated Classification of Model Errors on ImageNet
論文紹介:Automated Classification of Model Errors on ImageNet
 
モーダル間の変換後の一致性とジャンル表を用いた解釈可能性の考察 ~Text-to-MusicとText-To-ImageかつImage-to-Music...
モーダル間の変換後の一致性とジャンル表を用いた解釈可能性の考察  ~Text-to-MusicとText-To-ImageかつImage-to-Music...モーダル間の変換後の一致性とジャンル表を用いた解釈可能性の考察  ~Text-to-MusicとText-To-ImageかつImage-to-Music...
モーダル間の変換後の一致性とジャンル表を用いた解釈可能性の考察 ~Text-to-MusicとText-To-ImageかつImage-to-Music...
 
論文紹介:Semantic segmentation using Vision Transformers: A survey
論文紹介:Semantic segmentation using Vision Transformers: A survey論文紹介:Semantic segmentation using Vision Transformers: A survey
論文紹介:Semantic segmentation using Vision Transformers: A survey
 
CTO, VPoE, テックリードなどリーダーポジションに登用したくなるのはどんな人材か?
CTO, VPoE, テックリードなどリーダーポジションに登用したくなるのはどんな人材か?CTO, VPoE, テックリードなどリーダーポジションに登用したくなるのはどんな人材か?
CTO, VPoE, テックリードなどリーダーポジションに登用したくなるのはどんな人材か?
 
Open Source UN-Conference 2024 Kawagoe - 独自OS「DaisyOS GB」の紹介
Open Source UN-Conference 2024 Kawagoe - 独自OS「DaisyOS GB」の紹介Open Source UN-Conference 2024 Kawagoe - 独自OS「DaisyOS GB」の紹介
Open Source UN-Conference 2024 Kawagoe - 独自OS「DaisyOS GB」の紹介
 
TataPixel: 畳の異方性を利用した切り替え可能なディスプレイの提案
TataPixel: 畳の異方性を利用した切り替え可能なディスプレイの提案TataPixel: 畳の異方性を利用した切り替え可能なディスプレイの提案
TataPixel: 畳の異方性を利用した切り替え可能なディスプレイの提案
 
デジタル・フォレンジックの最新動向(2024年4月27日情洛会総会特別講演スライド)
デジタル・フォレンジックの最新動向(2024年4月27日情洛会総会特別講演スライド)デジタル・フォレンジックの最新動向(2024年4月27日情洛会総会特別講演スライド)
デジタル・フォレンジックの最新動向(2024年4月27日情洛会総会特別講演スライド)
 
論文紹介:Content-Aware Token Sharing for Efficient Semantic Segmentation With Vis...
論文紹介:Content-Aware Token Sharing for Efficient Semantic Segmentation With Vis...論文紹介:Content-Aware Token Sharing for Efficient Semantic Segmentation With Vis...
論文紹介:Content-Aware Token Sharing for Efficient Semantic Segmentation With Vis...
 
自分史上一番早い2024振り返り〜コロナ後、仕事は通常ペースに戻ったか〜 by IoT fullstack engineer
自分史上一番早い2024振り返り〜コロナ後、仕事は通常ペースに戻ったか〜 by IoT fullstack engineer自分史上一番早い2024振り返り〜コロナ後、仕事は通常ペースに戻ったか〜 by IoT fullstack engineer
自分史上一番早い2024振り返り〜コロナ後、仕事は通常ペースに戻ったか〜 by IoT fullstack engineer
 
AWS の OpenShift サービス (ROSA) を使った OpenShift Virtualizationの始め方.pdf
AWS の OpenShift サービス (ROSA) を使った OpenShift Virtualizationの始め方.pdfAWS の OpenShift サービス (ROSA) を使った OpenShift Virtualizationの始め方.pdf
AWS の OpenShift サービス (ROSA) を使った OpenShift Virtualizationの始め方.pdf
 
【早稲田AI研究会 講義資料】3DスキャンとTextTo3Dのツールを知ろう!(Vol.1)
【早稲田AI研究会 講義資料】3DスキャンとTextTo3Dのツールを知ろう!(Vol.1)【早稲田AI研究会 講義資料】3DスキャンとTextTo3Dのツールを知ろう!(Vol.1)
【早稲田AI研究会 講義資料】3DスキャンとTextTo3Dのツールを知ろう!(Vol.1)
 
SOPを理解する 2024/04/19 の勉強会で発表されたものです
SOPを理解する       2024/04/19 の勉強会で発表されたものですSOPを理解する       2024/04/19 の勉強会で発表されたものです
SOPを理解する 2024/04/19 の勉強会で発表されたものです
 
TSAL operation mechanism and circuit diagram.pdf
TSAL operation mechanism and circuit diagram.pdfTSAL operation mechanism and circuit diagram.pdf
TSAL operation mechanism and circuit diagram.pdf
 

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