春休み

今年は春休みが1か月半ありました。研究室が変わったので基本的に自由に過ごせました。

  • 部活で作っていたタンクの監視管理システムを完成させました。去年の11月ごろに作ったときにうまくいかなくて卒論があったので放置していたものがやっとできました。

    f:id:NKMRHYT:20220413101138j:plain:w300
    基板

  • 研究室の引継ぎと新しく入ってくるB4に向けた資料を作成しました。

  • 実家に帰省して運転免許証の更新と就活用のスーツを購入しました。

  • 卒業式がありました。卒業式の後には研究室の友達や部活の友達とお祝いをしました。

  • 部活の友達とフォレストアドベンチャーというアスレチック施設に行きました。思っていたよりしっかりとした施設ですごく楽しめました。

    f:id:NKMRHYT:20220413100754j:plain:w300
    フォレストアドベンチャー

  • 本を14冊読みました。読んだ内容をまとめてました。

  • 新しい研究室に行って少しでも早くなじめるようにしていました

卒業式

 3月23日に大学の卒業式がありました。僕は卒業しても同じ大学の院に進学するのであまり変化はないと感じています。ですが研究室が変わるので同じ研究室の人と会う機会が減ったり、仲の良かった人が就職したりほかの大学に進学するので会う機会が減ることはさみしく感じました。仲の良かった人で大学に残らない人とはこれからも関係が続くといいなと思いす。

 大学での4年間では友達に恵まれたなと感じています。友達がPCやプログラミングに興味があったので一緒になって勉強したことでプログラミングを始めたり、とても優秀な友達がいたのでその人のやり方を真似したりして成長できたりしました。院に進学しても人とのつながりを通して成長できればいいなと思います。

 大学に入るまでは言われたことをしっかりとやるといった性格でしたが、大学に入って自分で考えて勉強したりやることを考えるようになりました。どんなことをやるかとどれくらい頑張るかで成長できるかが決まったので院に進学しても自分が成長できることを全力で取り組みたいです。

Arduino学 Ⅱ ~データ通信編~

Arduino学 Ⅱ ~データ通信編~

目次

この資料の目的

 この資料はArduinoについてある程度勉強した人でArduinoでの通信の仕組みを理解したい人に向けて書きました。まだArduinoについて詳しくない人はArduino学 Ⅰを読んでみてください。

Arduino学 Ⅰ - NKMRHYTのブログ

Arduinoでは自分でライブラリを作らなくてもネットで見つかることが多く自分で作らない分にはこの内容を理解しなくても困りません。仕組みを理解したい人は読んでみてください。僕があまり詳しくないのでUART通信については書いていません。

はじめに

 マイコンから指令を送ったり、センサの値をデジタル値で読み取る際には通信を行う必要があります。どのようにデータをやり取りするのでしょうか?
 電圧がかかっている状態とかかっていない状態をタイミングよく切り替えることで通信を行っています。今回はセンサと通信を行い必要なデータを読み取ったり指令を送ったりする方法について説明します。説明の際には具体的なセンサを用いて説明しようと思います。

SPI通信

 MAX31855という温度センサを見てみましょう(MAX31855のデータシート)
データシートは説明書です。はじめは英語でいろいろ書いているので難しいと感じるかもしれませんがすぐに慣れます。

接続方法

 通信の開始終了を決めるSS、マスターからデータを送るMOSI、スレーブからのデータを受け取るMISO、タイミングを合わせるSCLを接続します。基本的にはマスターはArudinoです。SPI通信のセンサを複数使う際にはMOSI、MISO、SCLはマスターの同じピンでSSだけ変えます。データシートの1ページ目に書いています。

f:id:NKMRHYT:20220313232043p:plain
図1 配線図
このセンサではマイコンからのデータの送信はないのでマイコンのMOSIはつながっていません。このセンサではMISOはSO、SSはCSとなっています。

通信方法

 データシートの5ページ目にどのようにデータを送っているかが書いています。

f:id:NKMRHYT:20220313233058p:plain
図2 通信の様子
線が下側にある時がLOW上側にある時がHIGHです。図2のようにCSがLOWの時にCSLとSOが変化して通信をしています。通信を行っている間SCLは一定の間隔でHIGHとLOWを繰り返しています。どのタイミングで通信を行うかですが今回は立上りエッジです(図3参照)。
f:id:NKMRHYT:20220314001526p:plain:w300
図3 SPI_MODE
つまりSCLがHIGHになっているときにSOがHIGHかLOWかを見ることでデータを読み取ります。どのようにデータを決めているかは10ページに書いています(図4参照)。1がHIGH、0がLOWです。
f:id:NKMRHYT:20220314121314p:plain
図4 Memory Map

プログラム

#include <SPI.h>

SPISettings mySPISettings = SPISettings(5000000, MSBFIRST, SPI_MODE0);
int data;
float temp;

void setup() {
  Serial.begin(9600);
  SPI.begin();
}

void loop() {
  SPI.beginTransaction(mySPISettings);
  digitalWrite(SS, LOW);
  data = SPI.transfer16(0x0000);
  digitalWrite(SS, HIGH);
  SPI.endTransaction();
  temp = (data >> 2) * 0.25;
  Serial.println(temp);
  delay(10);
}

 3行目のSPISettings mySPISettings = SPISettings(5000000, MSBFIRST, SPI_MODE0);でSPI通信の設定値を入力しています。5000000(5MHz)が最大の通信速度です。MSBFIRSTは上の位から読んでいくという意味です。データシートに書いています。

D[30:18] contain the converted temperature in the order of MSB to LSB

先ほど述べたように立上りエッジで通信を行っていないときにSCLはLOWなのでMODE0です。SPI.begin();で初期化、SPI.beginTransaction(mySPISettings);で設定の初期化、digitalWrite(SS, LOW);で通信開始、data = SPI.transfer16(0x0000);で16bitのデータを受信(送信データがないので0x0000)、digitalWrite(SS, HIGH);で通信終了、SPI.endTransaction();でほかのライブラリがSPIバスを使用できるようにする、 temp = (data >> 2) * 0.25;で2進数から10進数に変換しています。

I2C通信

 ADS1115というADコンバータを使って説明します(ADS1115のデータシート)

接続方法

 図5を見てください。データを送受信するSDA、タイミングを合わせるSCLを接続します。SPI通信から送信と受信のピンが1つになったことと送信開始を決めるピンがなくなり4本から2本になりました。I2CではSDAとSCLをプルアップする必要があります。データシートでは31ページに書いています。

f:id:NKMRHYT:20220315010711p:plain
図5 配線図

通信方法

f:id:NKMRHYT:20220317173227p:plain
図6 通信の様子
 図6のようにSCLがHIGHの時にSDAがHIGHからLOWになったら通信開始です。最初の7bitはアドレスです。これはセンサの名前でどのセンサと通信するかを指定します。8bit目で通信の方向を指定します。9bit目で区切りとしてLOWを出力します。次の8bitからデータの通信を行います。最後にSCLがHIGHの時にSDAがLOWからHIGHになったら通信を終了します。

プログラム

#include <Wire.h>
#define ADDR 0b1001000
#define FSR 4.096

int data;
float volt;

void setup() {
  Wire.begin();
  Serial.begin(9600);
  
  Wire.beginTransmission(ADDR);
  Wire.write(0b00000001);
  Wire.write(0b11000011);
  Wire.write(0b10000011);
  Wire.endTransmission();
}

void loop() {
  Wire.beginTransmission(ADDR);
  Wire.write(0b00000000);
  Wire.endTransmission();

  Wire.requestFrom(ADDR, 2);
  while (Wire.available()) {
    data = Wire.read() << 8 | Wire.read();
  }

  volt = data * (FSR / pow(2, 15));
  Serial.println(volt);
  delay(100);
}

I2CはWire.hライブラリを使用します。Wire.begin();でライブラリを開始、Wire.beginTransmission(ADDR);で送信開始(かっこの中にアドレスを書く)、Wire.write(0b00000001);で書き込み(かっこ内に送信データを書く)、Wire.endTransmission();で送信終了、Wire.requestFrom(ADDR, 2);でデータの受信要求(かっこの中にアドレスと要求するデータのバイト数を書く)、 Wire.available()は読み取りのバイト数を返す、Wire.read()で読み取り、volt = data * (FSR / pow(2, 15));で2進数から10進数に変換しています。

Arduino学 Ⅰ

目次

この資料の目的

 この資料は研究室の新人向けに作成したものです。c言語を勉強したことがある人向けにArduinoでできることをできる限り簡単に説明することを目的としています。そのためわかりやすさを優先するために説明を省略している場合があります。

Arduinoとは

 マイクロコントローラ(マイコン)の一種です。一番よく使われているマイコンです。ですからネットで検索すればたいていのことが分かります。わからなかったらとりあえずググりましょう。またArduinoにはいくつか種類があります。一番有名なのはUNO、MICROは小さいといった感じです。ArduinoArduino言語というプログラミング言語で書きます。Arduino言語はc言語と親戚です。例えると標準語と方言のような関係です。

Arduino(マイコン)でできること

 Arduinoでできることは大まかにいうと電圧を出力すること、電圧を読み取ることです。基本的には電圧がかかっているかかかっていないかという2通りで出力、読み取りを行います(2進数)。出力するタイミングを制御することでセンサの読み取りやモータの制御を行っています。

Arduinoの使い方

準備

 Arduinoのソフトウェアをインストールしましょう(ダウンロード)
インストールしたらソフトを起動します。PCとArduinoを接続します。ツールからボード、シリアルポートを設定します。以上で準備ができました。

Arduinoを動かしてみよう

1. シリアルモニタに表示

 結果を確認したいときやデバックをする際に使います。これを適切に使えるようになるとデバックが早くなります。

void setup() {
  // put your setup code here, to run once:
  Serial.begin(9600);
  Serial.print('a');
}

void loop() {
  // put your main code here, to run repeatedly:
  
}

こうすることでシリアルモニタに表示できます。

プログラムの説明
  • void setup()(一行目の”{”から5行目の”}”で囲まれた範囲)は最初の一回だけ実行されます。
  • void loop()(7行目の”{”から10行目の”}”で囲まれた範囲は繰り返し実行されます。
  • 3行目のSerial.begin(9600);はシリアル通信の初期設定をしています。
  • 4行目のSerial.print('a');は文字を表示するためのプログラムです。(c言語はprintfでした。)
    練習

    以下の項目をやってみましょう

  • 繰り返し表示
  • 複数の文字(aaa)を表示
  • 数字を表示
  • 変数を表示
  • 改行
  • 2進数を表示
  • 文字と数字、文字と変数などを組み合わせて表示(print関数を複数使う)
  • シリアルブロッタ

2. シリアルモニタから入力

出力を変えたり、プログラムの分岐で使います。

void setup() {
  Serial.begin(9600);
}

void loop() {
  if (Serial.available() > 0) {

    char data = Serial.read();
    Serial.print(data);
  }
}

プログラムの説明
  • 6行目のSerial.available() > 0:入力があるかどうかを調べる
  • 8行目のSerial.read(); :読み取り
  • 9行目のSerial.print(data); :表示
    練習
  • 変数の型をcharからintにしてみよう(ASCIIコード)(シリアルモニタの右下の改行なしとかのところによって結果が変わる)

3. 電圧出力

const int LED_PIN = 13;

void setup() {
  pinMode( LED_PIN, OUTPUT );
}

void loop() {
  digitalWrite( LED_PIN, HIGH);
  delay( 1000 );

  digitalWrite( LED_PIN, LOW);
  delay( 1000 );
}

ArduinoのLEDが点滅します。

プログラムの説明
  • 1行目のconst int LED_PIN = 13;:変数に代入しています。(c言語と同じですね)
  • 4行目のpinMode( LED_PIN, OUTPUT );:13ピンを出力として使うことを宣言
  • 8行目のdigitalWrite( LED_PIN, HIGH);:電圧ON
  • 9行目のdelay( 1000 );:1000ms(1s)待機
  • 11行目のdigitalWrite( LED_PIN, LOW);:電圧OFF
    練習
  • ONOFFのタイミングを変えてみましょう
  • 8行目のHIGHと11行目のLOWは別の書き方があります。

4. PWM

 Arduinoの出力ピンは5Vしか出せません。では3V出したいときはどうすればよいでしょうか?
一つの方法としてPWM(Pulse Width Modulation)というものがあります。高速でONとOFFを繰り返すことで電圧が変わっているのと同様の結果を引き起こす方法です。

int PIN = 3; 
float V = 2.0;
int DUTY = V * 51;

 void setup(){
   pinMode(PIN, OUTPUT); 
 }
 
 void loop(){
   analogWrite(PIN, DUTY);
}

テスターで測ると約2V出力されていることが確認できます。

プログラムの説明
  • 3行目のint DUTY = V * 51;:電圧をデューティ比に変換しています。
  • 10行目のanalogWrite(PIN, DUTY);:PWM出力
    練習
  • ピンを変えてみよう(~がついているピンがPWMが使える)
  • 電圧を変えてみよう
  • V * 51 を説明してください
  • ほかの電圧を制御する方法を考えてみてください

5. 電圧読み取り

 ボタンのON、OFF判定などに使います。

const int DIN_PIN = 4;

void setup(){
    pinMode( DIN_PIN, INPUT );
    Serial.begin( 9600 );
}

void loop(){
    int value;
    
    value = digitalRead( DIN_PIN );
    Serial.println( value );

    delay( 1000 );
}

4ピンとグラウンドをつなぐと0、5Vをつなぐと1が表示される

プログラムの説明
  • 4行目のpinMode( DIN_PIN, INPUT );:入力に設定
  • 11行目のvalue = digitalRead( DIN_PIN );:読み取り
    練習
  • ピンを接続しないと0になったり1になったりしてしまいます。これを解決しましょう。(PULLUP、PULLDOWN)
  • PWMと組み合わせてみましょう(PWMの様子を確認できます。)

6. 電圧を測定

const int VOL_PIN = A0;

void setup(){
    Serial.begin( 9600 );
}

void loop(){
    int value;
    float volt;

    value = analogRead( VOL_PIN );

    volt = value * 5.0 / 1023;

    Serial.print( "Value: " );
    Serial.print( value );
    Serial.print( "  Volt: " );
    Serial.println( volt );


    delay( 500 );
}

電圧が読み取れます。

プログラムの説明
  • 11行目のvalue = analogRead( VOL_PIN );:電圧読み取り。
  • 13行目のvolt = value * 5.0 / 1023;:0から5vに変換(関係ないですが5.0を5とすると小数点以下が四捨五入されます)
    練習
  • いろいろなピンにつないでみましょう(基本0Vか5V)

7. ライブラリ

 センサを使う際などにプログラムが複雑になる場合ライブラリを使います(Serial.print、Serial.beginなどもライブラリ)。自分で作れますがArduinoの場合GitHubなどでダウンロードできることが多いです。いきなりライブラリを作るのは難しいのでまずはネットで探してダウンロードしたものを使うといいと思います。今回は僕が作ったAD5328(DAコンバータ)のライブラリを例に説明します ライブラリ。 右上のCodeからダウンロードできます。 Auruinoのソフトのスケッチ->ライブラリをインクルード->.ZIP形式のライブラリをインストールで使えるようになります。 使用する際はまずはsampleファイルを確認しましょう。

練習
  • ファイルを見てみよう(.hファイル、.cppファイル、keywords.txt、library.prorerties)
  • センサの主な通信方式であるI2C、SPI通信について説明しよう。

Arduino学 Ⅱ ~データ通信編~ - NKMRHYTのブログ

  • いろいろなライブラリを使ってみよう
  • ローパスフィルタについて勉強しよう

ローパスフィルタで復習する制御工学 - Qiita

卒業論文

昨日卒論試問がありました。1月初めから昨日まで毎日大学に来て卒論の作業をしていたのですがそれが終わり少し時間ができたところです。しんどかったですがいいものができたので良かったです。僕のいた研究室は研究室で作業を頑張っている人が多く一緒に頑張れたので良かったです。来年度は別の研究室に行くことになるので今年度行った研究はもうしないのですが納得する形で終えることができました。

年末の実家と船と自転車での福岡への帰路

 年末は29日に家につき5日に帰りました。その間実家では卒論を書くつもりでしたが、ついだらだらしてしまいほとんどできませんでした。帰省中は正月料理をはじめおなか一杯食べることができました。

 帰りは自転車があったので神戸港から新門司港まで船で帰りました。それから自転車で帰りました。船で一泊するのは小学生以来だったのですが想像以上に快適でした。個室だったのでぐっすり眠れました。風呂も大きく露天風呂もあり船からの景色を見ることができました。展望ルームにも行ったのですが僕以外に誰もいなかったので景色を堪能できました。明石海峡大橋が見れました。

f:id:NKMRHYT:20220113220747j:plain

f:id:NKMRHYT:20220113220838j:plain

f:id:NKMRHYT:20220113220843j:plain

f:id:NKMRHYT:20220113220847j:plain

展望ルームからの景色

その後展望デッキからも景色を見ました。風が強かったのです。明石海峡大橋は実家からも見れ見慣れているのですが船から見るととても大きくきれいでした。

f:id:NKMRHYT:20220113221113j:plain

f:id:NKMRHYT:20220113221122j:plain

f:id:NKMRHYT:20220113221133j:plain

f:id:NKMRHYT:20220113221143j:plain

f:id:NKMRHYT:20220113221218j:plain

f:id:NKMRHYT:20220113221158j:plain

展望デッキからの景色

その後テレビを少し見てから就寝しました。翌日は朝の7時に新門司港につきました。僕が自転車で5日かけて進んだ距離を一晩で進んだのでやっぱり交通機関はすごいと思いました。船から乗る時も降りるときも大きな出口から出るので少し面白かったです。

f:id:NKMRHYT:20220113221632j:plain

僕が乗った船

船を降りてすぐの道がとても荒れていて走りにくかったです。あと宗像らへんの自転車道がとても走りやすかったです。そして自分が自転車旅に慣れたのと疲れていなかったこともあり帰りも自転車で100㎞以上進んだのですが行よりも早くそして楽に帰ることができました。

福岡から神戸までの自転車旅 まとめ

きっかけと準備

福岡から神戸までの自転車旅 きっかけと準備 - NKMRHYTのブログ

1日目

福岡から神戸までの自転車旅 1日目 - NKMRHYTのブログ

2日目

福岡から神戸までの自転車旅 2日目 - NKMRHYTのブログ

3日目

福岡から神戸までの自転車旅 3日目 - NKMRHYTのブログ

4日目

福岡から神戸までの自転車旅 4日目 - NKMRHYTのブログ

5日目

福岡から神戸までの自転車旅 5日目 - NKMRHYTのブログ

6日目

福岡から神戸までの自転車旅 6日目 - NKMRHYTのブログ

まとめ <- now

福岡から神戸までの自転車旅 まとめ - NKMRHYTのブログ

 

 今回の旅を振り返ると最初軽い気持ちで行けるだろうと思っていましたが実際やってみると思っていたよりもとてもしんどかったです。2日目からしんどく、その後はずっとやめたいと思っていました。しかしもう少し頑張ろうということを繰り返しているうちに自分の力でゴールできました。親も僕がゴールできると思っていなかったそうです。精神的にも体力的にも成長できたと思います。でももう2度とやりたくないです。ただ少し時間がたってブログを書きながら振り返っているうちに少しいい思い出のように感じました。

 旅を通して観光はできませんでしたがいろいろな風景を見ることができたので良かったです。特に日本は山が多いことがわかりました。また車や電車はすごいと思いました。

 かばんを自転車に着けれなかったり、経路選択がうまくできなかったりしたので準備不足を感じ、準備の重要性を感じました。一方荷物の量、服装についてはたまたまちょうどよい量でした。雨が降らなかったり、暗い時間に危険な道を走らずに済んだのも運がよかったです。ついた後に親に僕がもう自分で考えれると思いあまりアドバイスをしなかったといっていました。今回の旅は僕の力というよりも運がよかったり親や友人の助けがあったからできたと思います。

 この旅で使用したお金についてまとめました。

f:id:NKMRHYT:20220113215144p:plain

使用したお金

 この旅の全工程の経路をGoogleマップにまとめました。ピンマークを押すと写真が見れます。