投稿

ラベル(C言語)が付いた投稿を表示しています

STM32での圧電スピーカーの使い方

イメージ
前回はArduinoで圧電スピーカーを使ってみたので、今度はSTM32で使っていきたい。 CubeMXでピンの設定を行う 圧電スピーカーを使うので「A0」のアナログピンを使うことにした。 設定は「PA0」を「TIM2_CH1」に設定する。 TimersからTIM2の設定を変更する。 ModeのChannel1を「PWM Generation CH1」に設定する。 ConfigrationのParameter SettingsのPrescalerを「84」に設定する。 設定が終わったら、保存を行いコードを更新する。 main.cでプログラムを書いていく Arduinoのtone()関数をSTM32ようにモドキ物を作成してみた。 TIM_MasterConfigTypeDef sMasterConfig = {0}; TIM_OC_InitTypeDef sConfigOC = {0}; int period; void periodSet(int p){ htim2.Init.Period = p; sConfigOC.Pulse = p/2; HAL_TIM_Base_Init(&htim2); HAL_TIM_PWM_ConfigChannel(&htim2, &sConfigOC, TIM_CHANNEL_1); } void tone(int freq,int ms){ long peri; peri=1000000L/(long)freq; period = (uint16_t)peri; //htim2.Init.Period = Hz; //HAL_TIM_Base_Init(&htim3); periodSet(period); HAL_TIM_PWM_Start(&htim2,TIM_CHANNEL_1); HAL_Delay(ms); } void noTone(int ms){ HAL_TIM_PWM_Stop(&htim2,TIM_CHANNEL_1); HAL_Delay(ms); } MX_TIM2_Initの関数にある下の二行をコメントアウトしておく。 TIM_MasterConfigTypeDef ...

Arduinoでの圧電スピーカーの使い方(tone関数)

イメージ
Arduinoで簡単な音楽を流してみたいと思う。 圧電スピーカーならオルゴール音みたいな感じにできると思うので使っていく。 圧電スピーカーの回路を作る 回路を作ると書いているが、作るのはいたってシンプル。 Arduinoのアナログピンに圧電スピーカーをつなげるだけ。 今回は「A0」ピンからGNDにつなげた。 圧電スピーカーは秋月電子より購入。 秋月電子→ http://akizukidenshi.com/catalog/g/gP-04118/ ArduinoIDEのプログラム Arduinoには「tone()関数」というものがある。 簡単に説明すると、出力するピンと周波数、出力時間を引数として代入することが出来る関数になる。 周波数は音の音階によって異なってくる。 代表的なドレミ音の周波数はこのような感じになってくる。 音階 ド レ ミ ファ ソ ラ シ ド 周波数 261Hz 293Hz 329Hz 349Hz 391Hz 440Hz 493Hz 523Hz 今回は#音については除外させてもらった。 詳しい音階の周波数を知りたい人は自分で調べてほしい。 これを使って簡単なメロディを流すプログラムを作成した。 #define PIN_SPK (A0) void setup() { pinMode(A0,OUTPUT); delay(1000); } void loop() { tone(PIN_SPK,261,500); //ド delay(500); tone(PIN_SPK,293,500); //レ delay(500); tone(PIN_SPK,329,500); //ミ delay(500); tone(PIN_SPK,349,500); //ファ delay(500); tone(PIN_SPK,391,500); //ソ delay(500); tone(PIN_SPK,440,500); //ラ delay(500); tone(PIN_SPK,493,500); //シ delay(500); tone(PIN_SPK,523,500); //ド d...

STM32F401 PWM制御のやり方・使い方

イメージ
  CubeMXでピンの設定を行う 今回はSTM32でPWM制御をやってみたい。 どうやら、TIMというものを使って行っていくらしい。 その中でも、TIM6とTIM7というものが割と使いやすいものらしい。 しかし、STM32F401にはTIM6やTIM7といった設定が見当たらない・・・。 調べたら、TIM2を使って似たようなことをやっている人がいたので、その人の記事を参考にしてやっていこうと思う ピンの設定を行う。 参考記事通りに今回はオンボードのLEDを使っていこうと思う。 まずは「PA5」を「TIM2_CH1」に変更する。 ピンの設定で「Timers」→「TIM2」を選択する。 「Mode」の「Channel1」を「PWM Generation CH1」にする。 「Prescaler」を0から「3」にする。 「Counter Period」を「999」にする。 設定できたら、保存を行いソースコードの更新を行う。 main.cでプログラムを書いていく 参考記事には「static void MX_TIM2_Init(void)」関数内にある 「TIM_masterConfigTypeDef smasterConfig」と「TIM_OC_InitTyapeDef sConfigOC」をグローバル変数にすると書いてあるので、まずはその二つをこんな感じにコメントアウトしておく。 static void MX_TIM2_Init(void) { /* USER CODE BEGIN TIM2_Init 0 */ /* USER CODE END TIM2_Init 0 */ //TIM_MasterConfigTypeDef sMasterConfig = {0}; //TIM_OC_InitTypeDef sConfigOC = {0}; /* USER CODE BEGIN TIM2_Init 1 */ /* USER CODE END TIM2_Init 1 */ htim2.Instance = TIM2; htim2.Init.Prescaler = 3; htim2.Init.CounterMode = TIM_COUNTERM...

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

イメージ
STM32F401-Nucleoでアナログジョイスティックを使おうと思う。 そのためにはDMA変換をつかってアナログ入力を2チャンネルで行う必要がある。 STM32を使うと、だいたいDMAが難しくて挫折したくなる。 しかし、難しいけど覚えると非常に便利な機能なのでぜひとも使っていきたい。 DMAとは Direct Memory Access(ダイレクトメモリーアクセス)の略。 ピンから読みこまれたアナログデータを変換して特定のレジスタに格納してくれる。 CPUは毎回、そこを確認すれば入力されたデータを確認できるのでCPUに余計な負荷をかけなくて済む。 要約すると、メモリ間のデータのやり取りをCPUを使わずに行えるものである。 しかし、よくわからないので複数のADCを使えるのも位の感覚でいいと思う。 ADC以外でも使えるみたいだけど、まだよくわからないので勉強していこうと思う。 CubeMXでピンの設定を行う まずはピンにADCを使う設定を行う。 二つ使うので「A0」と「A1」を使っていく。 STM32では「PA0」と「PA1」になる。 [Analog]→[ADC1]で詳細設定画面を開く。 [DMA_Settings]をクリックする。 「Add」をクリックする。 「DMA Request」を「ADC1」にする。 「DMA Request Settings」のModeを「Circular」に設定する。 「Priority」を「High」にする。 「Parameter Settings」クリックして詳細設定を行っていく。 [ADC_Settings]から設定する。 「Scan Conversion Mode」を「Enabled」にする。 「Continuous Conversion Mode」を「Enabled」にする。 「Discontinuous Conversion Mode」を「Disabled」にする。 「DMA Continuous Requests」を「Enabled」にする。 それ以外の設定はデフォルトの設定で何もいじらない。 [ADC_Regular_ConversionMode]の設定。 「Number Of Conversion」を「2」にする。 ...

STM32F401のADCの使い方

イメージ
STM32でADCの使い方をまとめる。 これはSTM32でアナログジョイスティックを使うための前段階の勉強になる。 CubeMXでピンの設定を行う STM32F401-Nucleoでアナログ入力を行えるピンは、Arduinoと同じ。 なので「A0」ピンを使っていこうと思う。 調べるとA0は「PA0」になるようだ。 PA0を選択して「ADC1_INO」に設定する。 ピンの設定はこれで終了。 ADC一つだけならこれだけで使える。 main.cでプログラムを書いていく まずは「USER CODE BIGEN Includes」に「<stdio.h>」と「<string.h>」をインクルードする。 /* Private includes ----------------------------------------------------------*/ /* USER CODE BEGIN Includes */ #include <stdio.h> #include <string.h> /* USER CODE END Includes */ あとはmain関数にこれらのコードを記述する。 /* USER CODE BEGIN WHILE */ int adc = 1; char str[16]; while (1) { /* USER CODE END WHILE */ /* USER CODE BEGIN 3 */ HAL_ADC_Start(&hadc1); HAL_ADC_PollForConversion(&hadc1, 100); adc = HAL_ADC_GetValue(&hadc1); sprintf(str, "ADC: %d\n\r", adc); HAL_UART_Transmit(&huart2, (uint8_t *)str, strlen(str), 1000); HAL_ADC_Stop(&hadc1); HAL_Delay(300); } /* US...

C言語のおさらい 配列の考え方・使い方

イメージ
配列とは データ処理をしていくとき、同じ型の変数を複数まとめて用意しておくほうが、便利な場合がある。そういうときに使うのが「 配列 」である。 配列には「 一次元配列 」と「 二 次元配列 」がある。 配列を使ったプログラムを書いてみる。 一次元配列 一次元配列のイメージとして、このような表を作成すると思ったほうが良い。                 Excelの一行分を作成して、それぞれ数値を代入できる変数を作成する感じ。 一次元配列の宣言 データ型 配列名[要素数]; 配列を構成する一つ一つの変数を「 配列要素 」または「 要素 」という。 それぞれの要素を判別するために、「 添え字 」という先頭から何番目かを示すための数字を一緒に使う。 一次元配列を書いてみる 一次元配列を使ったプログラムを実際に書く。 #include <stdio.h> int main(void) { //変数の宣言 int score[5]; int ans; //入力 printf("5教科の点数を入力する。\n"); printf("国語の点数→"); scanf("%d", &score[0]); printf("数学の点数→"); scanf("%d", &score[1]); printf("理科の点数→"); scanf("%d", &score[2]); printf("社会の点数→"); scanf("%d", &score[3]); printf("英語の点数→"); scanf("%d", &score[4]); //処理 ans = score[0] + score[1] + score[2] + score[3] + score[4]; //出力 printf(...

C言語のおさらい プログラムのモジュール化の考え方・使い方

イメージ
モジュール化とは プログラムが複雑化し大きくなればなるほど、わかりにくくなります。 それをわかりやすくするために、プログラムをいくつかの小さな部分(モジュール化)に分割していく必要がある。 これを「 プログラムのモジュール化 」といい、構造化プログラムのもう一つの考え方である。 「プログラムのモジュール化」のメリットがいくつかある。 一つ一つのモジュールは小さいのでわかりやすい。 モジュール単位で機能がまとまっていると、プログラムの変更(改良)がしやすい。 大きなプログラムを複数の人間で分担して開発できる。 一つのモジュールはなるべく一つの機能だけを持つようにする。これがモジュール化の重要なところ。 関数とは C言語では分割したモジュールを「 関数 」として扱う。なので、「 C言語プログラムとは、関数の集まりである 」といえる。 今まで使ったprintf()関数で考えてみる。データを一定の書式に従ってディスプレイに表示するには、さまざまな命令を合わせる必要がある。この命令群を毎回書いていてはプログラムが大きくなって、わかりにくくなる。 そこで、命令群をモジュール(関数)として分割すれば、プログラムを作成するときに出力の命令群を毎回書く必要がなくなり、負担が少なくなる。 C言語では、よく使われる関数は、あらかじめヘッダファイルに用意してある。このヘッダファイルをプログラムの1行目に「#include <stdio.h>」と書くことで、好きなように使える。このような関数を「標準関数」という。 標準関数以外の命令をモジュール化したいときは、プログラム作成者自身が関数として定義することができる。定義の仕方は、分割したモジュールに名前(関数名)をつけて、別の場所に書くだけ。あとは使いたいときにモジュールの関数名を指定すればいい。これを「 関数の呼び出し 」という。 関数のデータのやり取りの仕方 引数と戻り値 C言語の関数でデータのやり取りをするるには、「 引数 」と「 戻り値 」を使う方法が簡単である。引数とは、関数に入力するデータで、戻り値とは関数から出力されるデータである。引数は必要に応じて複数指定できるが、戻り値は一つしかない。 呼び出した側から渡す引...

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...

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()関数と使い方は変わらない。変数を入れたり「"」で囲って文字を書いたりする。 シリアルモニタから入力データを送る シリアルモニタで送りたいデータを入力して、送信を押せばデータの入力ができる。 送ったデータを表示させるプログラム...

ArduinoでADC調光を行う

イメージ
PWM制御 Arduinoでアナログ制御を行おうとすると、PWM制御という単語にたどりつく。 Arduinoは基本的に0Vか5Vの電気の出力しか行えない。しかし、PWMは出力する電気を高速でON/OFFすることで、疑似的に出力する電気の量を変えることができる。 100回のON/OFFの切り替えで、50回だけ5Vを出力し、疑似的に2.5Vの電気を出力することができる。 アナログ出力とアナログ入力 アナログ出力でLEDの明るさを調節する ArduinoはPWM制御の行えるピンが決まっている。 3、5、6、9、10、11ピンが使える。 今回は3番ピンでPWMによるLEDの調光を行う。 使う回路はこんな感じ。 スイッチがついているが、今回は使わない。 int led; void setup() { pinMode(3,OUTPUT); } void loop() { for(led=0;led<256;led++){ analogWrite(3,led); delay(5); } for(led=255;led>0;led--){ analogWrite(3,led); delay(5); } } Arduinoでアナログ出力を行うときはanalogWrite()という関数を使う。 アナログ出力で注意するところは、Arduinoでは0Vから5Vの変化を0から255の数値に変換して行う。 5Vの電気を出力したいとき255を引数として与え、2.5Vなら127の数値を引数として与える。 アナログ入力を行ってアナログ出力を調節する Arduinoでアナログ入力を行うときはA0からA7というピンを使う。 「A」はanalogのAである。 アナログ入力を行うので、可変抵抗器をスイッチの代わりに使ってみた。 可変抵抗器はその名の通りに、抵抗の値を変化させることができる。 これを使って、抵抗値の変化をアナログ入力してLEDの調光を行ってみる。 int led; int sw; void setup() { pinMode(A1,INPUT); pinMode(3,OUTPUT); } void...

Arduinoでスイッチを使ったLED点灯(Lチカ)

イメージ
プルアップ回路とプルダウン回路 スイッチを使ったLチカを調べていくと、この二つの回路についての説明が出てくる。 ようするに、マイコンを守るための電気回路だと思っておけば大丈夫。 プルアップ回路 何もしてないときに電気を流しておくことをプルアップ回路といいます。 この回路は、電気が流れていると常にマイコンに電気が入力される回路になります。 スイッチを押すとマイコンに流れる電気がOFFになり、離すとONになる回路です。 メリットとして、常に電気が流れているので静電気に対して丈夫。 デメリットとして、マイコンへの入力がスイッチを押すとOFFになるのでプログラムではそれを気にした記述を行わなければならない。 プルダウン回路 スイッチを押したときに電気を流すことをプルダウン回路になります。 この回路は、プルアップとは反対の動きをする回路になります。 メリットとして、プログラムでON/OFFの反転を考えなくてよい。 デメリットとして、静電気がマイコンにONの入力をする恐れがある。 慣例的にプルアップ回路を使う 昔の半導体の特性によって、プルアップ回路が使われてきている。 いろいろ調べてもプルアップ回路が使われてきてるものが多いので、プルアップ回路を使っておけば問題ない。 スイッチを使ったLED点灯・点滅回路 今回はこんな感じの回路を組んでみた。 Arduino互換機にLEDアレイをつなげて、スイッチをつなげてある。 スイッチを押してるときLEDを点灯させる プログラムはこんな感じ。 void setup(){ pinMode(11,INPUT); pinMode(2,OUTPUT); pinMode(3,OUTPUT); pinMode(4,OUTPUT); pinMode(5,OUTPUT); } void loop(){ if(digitalRead(11)==LOW){ digitalWrite(2,1); } else{ digitalWrite(2,0); } } digitalRead()というのはArduino専用の関数である。 ピンに対して入力信号を...

C言語のおさらい 基本的な演算子の使い方

イメージ
基本的な演算 C言語で使われる基本的な演算子は以下のものがある。 算術演算子 * ・・・掛け算(乗算) /  ・・・割り算(除算) % ・・・剰余算 +  ・・・足し算(加算) -  ・・・引き算(減算) 代入演算子 =  ・・・代入 計算の順番は算数・数学と同じ。 掛け算・割り算を先に計算する。 足し算・引き算を先に行いたいときは()で囲む。 剰余算が聞きなれないが、整数で計算した時の余りが答えになる。 (例)   5÷2=2あまり1 剰余算では1が結果になる。 変数の初期化 変数に値を設定すること。 「変数の型を指定する(int a)」「変数に値を入れる(a = 1)」のように2段階で行っているが、変数の型の指定と値の設定をまとめて行うことができる。 記述の仕方はこんな感じ。 データ型 変数名 = 値(または式); まとめて行うこともできるが、基本的に分けて行ったほうがプログラムのバグの確認が行いやすい。 これらをふまえて、プログラムを書いてみる。 #include <stdio.h> int main(void) { //変数の宣言 int num1; int num2; float num3; float num4; int add; int sub; int mul; int div; float div2; int rem; //初期化 num1 = 20; num2 = 7; num3 = 20; num4 = 7; //処理 add = num1 + num2; sub = num1 - num2; mul = num1 * num2; div = num1 / num2; div2 = num3 / num4; rem = num1 % num2; //出力 printf("足し算:a+b=%d\n", add); printf("引き算:a-b=%d\n", sub); printf("掛け算:a*b=%d\n", mul); printf("整数の割り算:a/b=%d\n...