投稿

5月, 2021の投稿を表示しています

Arduinoでのアナログジョイスティックの使い方

イメージ
Arduinoのアナログジョイスティックについてまとめておこうと思う。 秋月電子→ http://akizukidenshi.com/catalog/g/gK-10263/ ゲーム機に使われている操作機器なので、簡単にプログラミングすることが出来る。 アナログジョイスティックの回路を作る 上から見た感じはこんな風にしてみた。 これだとどうつないでいるのかわからないので、アナログジョイスティックを外した画像もはっておく。 CN1と書かれたほうが電源のつながっているピン側になる。 10kΩの抵抗を挟んでおくとよい。 ブレッドボードの下側を通るようにつないだので、LCDディスプレイを見やすくなる。 なるべくブレッドボードの端に置いたので、ほかのものをつなぎやすくなる。 ブレッドボードで回路を作るときの参考にしてほしい。 ArduinoIDEのプログラム // ------------------------------------------------------------ // インクルード // ------------------------------------------------------------ #include <Wire.h> #define PIN_AX (A0) #define PIN_AY (A1) void setup() { Wire.begin(); lcdInit(); pinMode(PIN_AX,INPUT); pinMode(PIN_AY,INPUT); lcdDisp1("Hello"); delay(1000); } void loop() { int aj; aj=ajoyget(); if(aj&0x08){ lcdDisp1("up"); } if(aj&0x04){ lcdDisp1("down"); } if(aj&0x02){ lcdDisp1("left"); } if(aj&0x01){ lcdDisp...

STM32F401でのLCDモジュール(AQM0802)の使い方

イメージ
マイコンボードなので、LCDディスプレイをつないで表示を行っていこうと思う。 今回使うLCDモジュールはAQM0802である。 秋月で買えるモジュールキットがあるので、それを使っていく。 秋月電子→ http://akizukidenshi.com/catalog/g/gK-06795/ CubeMXでピンの設定を行う STM32F401-NucleoでI2C通信を行えるピンは「D14」と「D15」がSDAとSCLに対応している。 調べるとD14は「PB9」、D15が「PB8」になる。 最初にピンの設定で、「PB8」は「I2C1_SCL」を選択、「PB9」は「I2C1_SDA」を選択する。 選択すると黄色の状態になる。 左側のタブから「Connectivity」→「I2C1」をクリックする。 「Disable」を「I2C」に変更する。 変更すると、黄色になっていた状態から緑色の状態になるので設定の完了である。 「ファイル(F)」→「保存(S)」でソースコードにピンの設定を自動反映させる。 main.cでプログラムを書いていく まずは「USER CODE BIGEN Includes」に「<string.h>」をインクルードする。 /* Includes ------------------------------------------------------------------*/ #include "main.h" /* Private includes ----------------------------------------------------------*/ /* USER CODE BEGIN Includes */ #include <string.h> /* USER CODE END Includes */ 「Private user code」にこれらのコードを記述する。 /* Private user code ---------------------------------------------------------*/ /* USER CODE BEGIN 0 */ //instructionの送信 in...

ArduinoでLCDモジュールの使い方(AQM0802)

イメージ
AQM0802とは AQM0802は、I2C接続の小型液晶モジュールと呼ばれるものになる。 8文字×2行の文字を表示することが出来る。 基本的に秋月電子で購入できる、ピッチ変換キットを使うことが多い。 秋月電子商品ページより ブレッドボードに簡単に挿して使えるようになるので、非常に便利。 I2C通信 AQM0802はI2C通信というもので、Arduinoとデータの通信を行う。 I2C通信はフィリップス社が開発したシリアル通信である。 Arduinoでは様々なセンサがこの通信規格を使ってデータのやりとりを行うことが出来る。 AQM0802を使う AQM0802モジュールのはんだ付け 秋月で購入したキットにはんだ付けを行っていく。 基板上のPUと書かれた部分をはんだ付けすると、基板内で10kΩのプルアップ抵抗を内蔵してくれる。 今回ははんだ付けせずに、ブレッドボード上でプルアップ抵抗をつけることにする。 ブレッドボードでの回路作成 AQM0802を使うには3.3Vの動作電圧で使うようにと秋月電子の商品ページには記載されている。 いろいろネットで調べてみるとAQM0802本体は5.5Vの電圧まで耐えることができるらしい。 だが、このブログでは3.3Vの動作電圧を守って動かしてみようと思う。 そのために必要になるのがレベル変換モジュールになる。 リンク このモジュールを使えば、5Vの電圧を安全に3.3Vに変換してくれる。 双方向なので、3.3Vを5Vに変換することもできる。 3.3Vの動作電圧のモジュールを扱うなら何個か持っておくと非常に便利。 こんな感じにブレッドボードに回路を組んでみた。 レベル変換モジュールはArduinoから5Vと3.3Vの電源を取っている。 Arduinoはピンから出力される電圧は5Vである。これをレベル変換モジュールで3.3Vに変換してAQM0802につなげている。 I2C通信はSCLとSDAという二つのピンにつなげる必要がある。Arduino nanoではA5がSCL、A4がSDAピンとして使える。 そして、AQM0802には3.3Vのプルアップ抵抗をブレッドボードで組んでおいた。 A...

C言語のおさらい 繰り返し処理 for文の使い方

イメージ
C言語で繰り返し処理を表すもう一つの方法として「 for文 」がある。 for文には繰り返し条件以外に 繰り返し処理前の初期値設定 と 繰り返し処理ごとに行う処理 を書くことができる。 for文の書式 for (式1; 式2; 式3) { 繰り返し処理する文1; 繰り返し処理する文2; } 式1には、繰り返し処理前に実行する処理(初期値の設定など)を書く。 式2には、繰り返しの条件式を書く。 式3には、{}内の処理を1回終了ごとに実行する処理を書く。 式2が成立している間、{}内の文を繰り返し処理する。(前判定型) 式1、式2、式3はそれぞれ省略できるが「;」は省略できない。 for文を書いてみる 何事も実践が大事。 #include <stdio.h> int main(void) { //変数の宣言 int loop; //処理 for (loop = 1; loop <= 3; loop = loop + 1) { printf("ループ回数:%d\n", loop); } return 0; } 実行結果がこちら。 while文と変わらない実行結果になるものを書いてみた。 繰り返し処理を書くなら、好きなほうを書いていっていいと思う。 インクリメントとデクリメント 繰り返し処理では「loop = loop + 1」のように、変数に1を足して同じ変数に代入する処理や逆に1を引いて同じ変数に代入する処理をよく使う。 C言語では、「+1」をインクリメント演算子(++)、「-1」をデクリメント演算子(--)で表せる。 今回はfor文で使ってみる。 #include <stdio.h> int main(void) { //変数の宣言 int loop; //処理 for (loop = 1; loop <= 3; loop++) { printf("ループ回数:%d\n", loop); } return 0; } 実行すると、上の画像と同じ結果が表示される。 ちょっとカッコよく書けるので使っていこう。

C言語のおさらい 繰り返し処理 while文の使い方

イメージ
  同じ処理をするデータが複数あるとき、それぞれ一つのデータごとに書いていくのはとても効率が悪い。そこで、処理を繰り返すことにより複数のデータの処理を1回で済ませられる繰り返し型の文を使えば、効率的である。 繰り返し型には「while文」と「for文」の二種類がある。 今回はwhile文についてまとめる。 while文の書式 while文には、前判定型の「while文」と後判定型の「do while文」がある。 while文の書式(前判定型) while(条件式){ 繰り返し処理したい文1; 繰り返し処理したい文1; } do while文の書式(後判定型) do { 繰り返し処理したい文1; 繰り返し処理したい文1; }while(条件式); while(条件式)の条件式には通常比較を行う式を書く。 条件式が成立している間、{}内の文を繰り返して処理を行う。 while文を書いてみる 実際に以下のプログラムを実行してみる。 #include <stdio.h> int main(void) { //変数の宣言 int loop; //入力 loop = 1; //処理 while (loop <= 3) { printf("ループ回数:%d\n", loop); loop = loop + 1; } return 0; } 実行結果がこうなる。 while文の注意点 前判定型と後判定型の違いは、繰り返し処理の最低実行回数が0回か1回かということ。 実際にそうなかプログラムを書いてみる。 #include <stdio.h> int main(void) { //変数の宣言 int loop; int doloop; //入力 loop = 1; doloop = 2; //処理 while (loop == doloop) { printf("前判定したよ\n", loop); } do { printf("後判定したよ\n"); } while (loop == doloop); ret...

オリンピック開催への準備は着実に進んでいる!

 最近は、オリンピック・パラリンピックの仮設工事現場に行く機会がありました。 各会場近くの人はわかると思いますが、すでにオリンピック・パラリンピック開催に向けて、各会場では必要な仮設工事が進んでいます。 現在は工事関係者などオリンピック・パラリンピック開催に向けて必要な人以外は中に入れない状況です。 世の中では開催に向けて疑問の声があったりしますが、現場レベルではIOCや政府が開催すると言い切っているので、工事は着実に行われています。 僕は工事関係者として中に入って仕事をしました。 スポーツ・コンサート関係の仕事をしている人は、これが数少ない仕事になります。 配信で音楽アーティストがライブを行ってたりしても、やはり業界的に活気がない状況です。 気軽に中止しろとは言えるけど、そこで実際に働いている人は仕事がなくなることになります。 イベント業は不要不急の事柄に当たると思いますが、イベント業で働いている人が仕事をなくし、転職して別の業界に行ってしまったら、世の中からイベントがなくなると思います。 自分たちが楽しめる場所・機会が失われることになります。 コロナ禍で家で楽しむ方法を考える機会が多くなり、もうイベントなんて行かなくていいじゃんと思う人もいると思います。 それでも、コンサートを楽しみたい、スポーツを会場で観戦したいと思う人は必ずいます。 オリンピック・パラリンピックはそういった人が楽しめるように、全力で開催に向けていろんな人が努力しています。 そういった努力が無駄にならないように、たくさんの人に感染拡大を防止するような行動を行ってほしいと思います。 外に出てたくさんの人が集まって楽しむ機会はありませんが、ワクチン接種が広まればそういったことが出来るようになります。 まだまだ我慢の時が続きますが、オリンピック・パラリンピックが家で観て楽しめる祭典になってくれることを祈ります。

C言語のおさらい 条件分岐 switch文の使い方

イメージ
switch 文の書式 条件により、選択する処理が複数になる「多分岐型」をC言語で表すときは、「switch 文」を使う。 書き方はこのような感じ switch (式) { case 値1: 値1が成立していたときに実行する文; break; case 値2: 値2が成立していたときに実行する文; break; case 値3: 値3が成立していたときに実行する文; break; default: すべてのcaseが成立しないときに実行する文; break; } switch (式) の()内には、通常整数型か文字型の変数名を指定する。 変数の値とcase 値が一致した時に「:」以下の文を実行する。 「:」以下の文が複数ある場合でも{}をつけなくてよい。 caseごとに処理の終わりに「break;」を書く。 defaultで実行する文がない場合、defaultは省略できる。 switch 文を書いてみる switch 文の特徴として、「変数の値とcase 値が一致した時に「:」以下の文を実行する。」があります。 なのでこのようなプログラムを実行すると、画像の結果になります。 #include <stdio.h> int main(void) { //変数の宣言 int x; //初期化 x = 0; //入力 printf("0から3の数値を入力してね→"); scanf("%d", &x); //処理 switch (x) { case 0: printf("あいうえお\n"); case 1: printf("かきくけこ\n"); case 2: printf("さしすせそ\n"); case 3: printf("たちつてと\n"); default: printf("なにぬねの\n"); } return 0; } 実行結果のように、case 0:以降の処理がすべて実行されていることがわかります。 なので、目的の処理だけを実行...

C言語のおさらい 条件分岐 if文の使い方

イメージ
if 文の書式 条件の真と偽により処理が二つに分岐する二分岐型をC言語で表すときは、「if 文」を使う。 書き方はこのような感じ if(条件式) { 条件が真のときに実行する文; } else { 条件が偽のときに実行する文; } if(条件式)の()内には、通常比較を行う式が入る。 条件が偽のときに実行するぶんがない場合は、else 以下を省略できる。 実行する文が一つしかない場合は、文のブロックの規則に従い{}を省略できる。 比較演算子 if 文などで使う条件式には、だいたい比較を行う式が使われる。 このときに、使われるのが「比較演算子」である。 比較演算子 <  ・・・左辺は右辺より小さい >  ・・・左辺は右辺より大きい <=  ・・・左辺は右辺以下 >=  ・・・左辺は右辺以上 ==  ・・・左辺と右辺は等しい !=   ・・・左辺と右辺は等しくない 比較演算子は数学などで使っているものと意味は同じ。ただし、「≧」「≦」という記号がキーボード上にはないため、「<=」「>=」のように分解して使っている。 C言語では「=」を代入演算子の意味で使っているため「==」のように「=」を二つならべて、「等しい」という意味を表す。 if 文の使い方 実際に以下のプログラムを実行してみる。 #include <stdio.h> int main(void) { //変数の宣言 int x; //入力 printf("入力された数値が10以上か判定する\n"); printf("数値を入力:"); scanf("%d", &x); if (x >= 10) { printf("そうです\n"); } else { printf("違います\n"); } return 0; } 実行結果がこの画面。 10という数値が入力されたので、「そうです」と表示がされる。 9とかを入力すれば「違います」と実行結果に表示されるので、試してほしい。 if 文のネスト構...

C言語のおさらい 構造化プログラミングの考え方

イメージ
構造化プログラミング プログラムを作成するときに1番大切なことは 誰にでもわかりやすいプログラムを作成すること 。 では、どうするか? これに対する回答として1968年にオランダのダイクストラが提唱した 構造化プログラミング 。 三つの基本構造を組み合わ、一つの処理を一つの入り口と一つの出口によって構成する 、という考え方。 三つの基本構造 順次型 最も基本となる処理構造。直線型、連接型とも呼ばれる。 順次型は、 命令を上から下へ順番に一つずつ実行 する。 記述された順番が処理される順番となる構造。 分岐型 条件によって処理の流れが分かれる処理構造 。選択型、判断型とも呼ばれる。 分岐型は条件を判定し、その結果によって違う処理を行い、それぞれの実行終了後に合流する構造になっている。分岐型は、処理の流れの分かれ方によって「 二分岐型 」と「 多分岐型 」に分かれる。 二分岐型 条件の真と偽によって、 二つの処理のうち選択する構造 。注意しなければならないのは、片方の処理を実行した場合、もう一方の処理は実行されないということ。 例えば、「縦=横」の条件が真ならば「”正方形”の出力」だけ実行され、「”長方形”の出力」は実行されない。 二分岐型はプログラムで使用される命令から「IF THEN(ELSE)型」とも呼ばれる。 多分岐型 二分岐型だけ使用してプログラムをつくると、処理が面倒になることがある。 これを解消するために考えられたのが多分岐型の処理構造。 ある項目の値などによって選択する 処理が三つ以上になる場合に使用される。 多分岐型は、プログラムで使用される命令から「DO CASE 型」とも呼ばれる。 繰り返し型 条件によって命令を複数回繰り返す処理構造。反復型、ループ型も呼ばれる。 「条件が成立するまで処理を繰り返す修了条件」と「 条件が成立している間処理繰り返す継続条件 」の二つの書き方があり、どちらを使うかはプログラム言語によって決まる。C言語では後者の「 継続条件 」を使用する。 繰り返し型は、条件を半手するタイミングによって「 前判定型 」と「 後判定型 」に分けられる。 前...

C言語のおさらい scanf関数の使い方

イメージ
Scanf() 関数 scanf() 関数は、キーボードから入力するときにつかう標準関数。 キーボードから入力されたデータを指定した形式で変数に格納します。 基本的はこのような感じで書く。 scanf("書式" ,&変数名); ただし、「"書式1"」の中に文字を記述することができない。 入力を要求するメッセージなどが必要な時は、scanf() 関数の前にprintf() 関数でメッセージを表示させる。 書式の指定はprintf() 関数と同様に「 % 」と 特定の文字 で指定する。 %d  ・・・整数を10進数で入力する %u  ・・・整数を符号なしの10進数で入力する %c  ・・・1文字を入力する %s  ・・・文字列を入力する %f  ・・・float型での実数を入力する %lf ・・・double型での実数を入力する Visual Studio 2019でscanf()を使うときの注意点 以下のソースコードを記述してビルドすると、通常はエラーが発生してデバッグができない。 #include <stdio.h> int main(void) { //変数の宣言 int x; //入力 printf("数値を入力→"); scanf("%d", &x); //出力 printf("入力された数値は%dです\n", x); return 0; } これは、Visual Studio 2019のデフォルトの設定ではscanf() 関数が使えない。 なので、プロパティページから設定の変更を行っていく。 ①[プロジェクト]→[プロパティ]からプロパティページを開く。 ②[C/C++]→[全般]から、SDLチェックを「はい」から「いいえ」に変更して適用をクリック。 ③[C/C++]→[コード生成]から、ランタイムライブラリを「マルチスレッドデバッグ」に変更して適用をクリック。 ④2つの変更ができたら確認して、OKをクリックする。 これで、ビルドした時にエラーが発生しなくなる。 デフォルトの設定でSDLチェックを...

ArduinoIDEのシリアルモニタから文字を表示する

イメージ
  Arduinoで文字を表示する方法はシリアルモニタで表示させるか、LCDディスプレイを使って表示させるかの二通りの方法が一般的である。 シリアルモニタで表示する Arduino IDEのシリアルモニタはルーペマークをクリックすると表示される。 これは、Arduinoとパソコン間でシリアル通信を行い、文字を表示させることのできる画面になる。 この画面から、データの入力を行ったりすることもできる。 Arduinoとパソコンでシリアル通信を行う シリアルモニタに表示する シリアルモニタで「Hello World」と表示させてみる。 ソースコードがこれ。 void setup(){  Serial.begin(9600);  delay(1000); Serial.print("Hello World"); } void loop(){ } シンプルに一回だけ表示させてみた。 setup()関数で「Serial.begin(9600);」と書いている。 これは、Arduinoでシリアル通信を行うために書かなければならないArduino専用の関数になる。 「9600」という数値は、シリアル通信の速度を示している。 シリアルモニタの下側に「9600bps」と表示されてるものである。 Arduino側とシリアルモニタ側でbpsの数値は合わせておく必要がある。 数値が違うと正常に通信が行われないので注意する。 Arduinoのデフォルト設定で使うなら、基本的に「9600」で問題ない。 「delay(1000);」はシリアル通信を行うまでに必要な待機時間になる。 シリアル通信もArduino側で準備する必要がある。 だいたい「1秒」待てば問題ないので、delay関数で待っている。 Serial.print()はArduinoのシリアルモニタに文字を表示させるための関数になる。 基本的に、C言語のprintf()関数と使い方は変わらない。変数を入れたり「"」で囲って文字を書いたりする。 シリアルモニタから入力データを送る シリアルモニタで送りたいデータを入力して、送信を押せばデータの入力ができる。 送ったデータを表示させるプログラム...