Help us understand the problem. What is going on with this article?

Arduinoで音を出す、光らせる、動かす

More than 5 years have passed since last update.

00.ウォーミングアップ

スピーカをつないで音をだしてみよう

使用する部品
ブレッドボード
breadboard.png

ArduinoとUSBケーブル
IMG_1355.jpg

スピーカーとジャンパーピン
IMG_1354.jpg

配線例

IMG_1350.jpg

コード

speaker.ino
// 8番ピンをスピーカーに接続する
const int speaker = 8;

// ここで初期化する
void setup()
{
  // スピーカーをつないだピンを出力に設定する
  pinMode(speaker, OUTPUT);
}

// ここからループに入る
void loop()
{
  // スピーカーをつないだピンに5Vをかける
  digitalWrite(speaker, HIGH);
  // 1m秒まつ
  delay(1);
  // スピーカーをつないだピンを0Vにする
  digitalWrite(speaker, LOW);
  // 1m秒まつ
  delay(1);
}

プログラミング記述時のおやくそく

  • 基本、半角で入力する
  • 半角カナは使わない
  • 大文字、小文字は区別して書く
  • 文の終わりには「 ; 」をつける
  • コメントは「 // 」の後に書く。
  • コメント欄以外、日本語は使えません。

プログラミングの基本文法

  • 変数 >> 値を入れる箱。int hako char hakoのように書きます。
  • 型 >> 変数を入れる箱の大きさ charだと1バイト、intだと2バイトの大きさになります。
  • 関数 >> 手続きをひとまとめにしたもの。例えば以下のように書きます。()の中に引数、{}の中に処理をかきます。
kansuu.c
void setup() {
    something();
}
ウォーミングアップで使用した関数
1. setup() // 最初に初期設定をする場合、この関数の中に書きましょう。
2. pinMode(speaker, OUTPUT) // ピンを出力(OUTPUT)もしくは入力(INPUT)に切り替えます
3. digitalWrite(pin, HIGH); // 出力にしたピンに電圧をかける(HIGH)もしくは電圧をかけない(LOW)にします

参考ドキュメント

01.サンプル : スピーカー改

speaker_while.ino
// 8番ピンをスピーカーに接続する
const int speaker = 8;

// ここで初期化する
void setup()
{
  // スピーカーをつないだピンを出力に設定する
  pinMode(speaker, OUTPUT);
  // 9600bpsでシリアル通信を始めます
  Serial.begin(9600);
}

// ここからループに入る
void loop()
{
  // シリアル通信でパソコンから入力された文字を変数に保存する
  int sw = Serial.read();
  // もしaという文字が送られてきたら
  if (sw == 'a') {
    // 高めの音を出す関数を呼び出す
    hiSound();    
  // もしsという文字が送られてきたら
  } else if (sw == 's') {
    // 低めの音を出す関数を呼び出す
    lowSound();
  }
}

// 高い音を出す関数
void hiSound()
{
  int i = 0;
  while(i<200) {
      digitalWrite(speaker, HIGH);
      delay(1);
      digitalWrite(speaker, LOW);
      delay(1);
      i = i + 1;
  }
}

// 低い音を出す関数
void lowSound()
{
  int i = 0;
  while(i<200) {
      digitalWrite(speaker, HIGH);
      delay(10);
      digitalWrite(speaker, LOW);
      delay(10);
      i = i + 10;
  }
}    

01.サンプルで新しく出てきた文法

if(条件式){処理}  // ifの後に()を書き、中に条件式を書きます。中の条件が真の場合は{}の中が実行され、偽であれば実行されない。
while(条件式){処理} // whileの後に()を書き、中に条件式を書きます。中の条件式が真の間はずっと{}の中に書いた処理が実行され続けます。

01.サンプルで新しく出てきた関数

Serial.begin(9600); // シリアル通信を()内に書いた速度で始めます
Serial.read(); // PCからのキーボード操作を読み込みます

02. サンプル : For文を使って音を少しづつ高くする

speaker_for.ino
// 8番ピンをスピーカーに接続する
const int speaker = 8;
// ここで初期化する
void setup()
{
  // スピーカーをつないだピンを出力に設定する
  pinMode(speaker, OUTPUT);
}

// ここからループに入る
void loop()
{
  // 変数iを宣言する
  int i;
  // forループにはいる
  for (i=0; i<1000; i++)
  {
    digitalWrite(speaker ,HIGH);
    // マイクロ秒単位で待つ
    delayMicroseconds(i);
    digitalWrite(speaker ,LOW);
    delayMicroseconds(i);
  }
  // forループに入る
  for (i; i>0; i--)
  {
    digitalWrite(speaker, HIGH);
    delayMicroseconds(i);
    digitalWrite(speaker, LOW);
    delayMicroseconds(i);
  }
}

02.サンプルで新しく出てきた文法

for(初期化; 繰り返し条件式; 増減){} // 変数を「初期化」の部分で初期化し、「繰り返し条件式」が真である限り{}内に書かれた処理を繰り返す。繰り返す際に「増減」のところに書いている値ずつ初期化した変数を増やしていく。

02.サンプルで新しく出てきた関数

delayMicroseconds(ms); //msマイクロ秒待つ。マイクロはミリの1/1000

03. サンプル : ボリュームでピッチ変換

配線図
speaker_pitch.jpg

コード

speaker_pitch.ino
// 8番ピンをスピーカーに接続する
const int speaker = 9;
// A0番ピンをボリュームにつなぐ
const int volume = A0;

// ここで初期化する
void setup()
{
  // スピーカーをつないだピンを出力に設定する
  pinMode(speaker, OUTPUT);
}

// ここからループに入る
void loop()
{
  // ボリュームの値を読み込むための変数をつくる
  int volumeValue = analogRead(volume);

  // volumeValueのとる値の範囲を変更する
  map(volumeValue, 0, 1024, 1000, 2500);

  // ボリュームの値から周波数を決めて音を鳴らす
  tone(speaker, volumeValue, 10);

}

03.サンプルで新しく出てきた関数

map(volumeValue, 値1, 値2, 値3, 値4); // volumeValueから読んだ値の範囲を変える。[値1から値2]の範囲から[値3から値4]の範囲へ変換。
tone(ピン, 周波数, 持続時間); //指定されたピンに指定された周波数を指定した時間、つくりだします

**配線例**

![rgb_led.jpg](https://qiita-image-store.s3.amazonaws.com/0/41825/7a3488d6-aa72-850e-8d02-06aa96a8eee0.jpeg "rgb_led.jpg")


**コード**

04.サンプル : RGBLED

部品
rgbled.jpg

配線例

rgb_led.jpg

コード

rgbLED.ino
// 変数を宣言
int i;
// anodeピンを設定する
int anode = 4;
// 各色ledをそれぞれ設定
const int red = 3;
const int green = 5;
const int blue = 6;
// 待ち時間を設定する
int delayTime = 30;

void setup()
{
  pinMode(anode, OUTPUT);  // anode common
  digitalWrite(anode, HIGH); // 4番ピンをHIGHに設定する

  turnOffLed();
}

void loop()
{
  // iの値が小さくなるにつれ明るく光る
  for(i = 255; i > 70; i--){
    analogWrite(red, i);
    delay(delayTime);
  }
  turnOffLed();

  for(i = 255; i > 70; i--){
    analogWrite(green, i);
    delay(delayTime);
  }
  turnOffLed();

  for(i = 255; i > 70; i--){
    analogWrite(blue, i);
    delay(delayTime);
  }
  turnOffLed();
}


// すべてのLEDを消す
void turnOffLed()
{
  analogWrite(red, 255);// 赤を消す
  analogWrite(green, 255); // 緑を消す
  analogWrite(blue, 255); // 青を消す
}

05.サンプル : サーボモーター

配線例

servo.jpg

コード

servo.ino
// サーボのライブラリを読み込む
#include <Servo.h>

Servo servo; //サーボのインスタンス

void setup() {
  // シリアル通信開始
  Serial.begin(9600);
  // サーボの信号線を6番ピンに接続
  servo.attach(6);
}

void loop() {
  // シリアル通信からの入力を変数valに格納
  int val = Serial.read();

  // switch文
  switch (val) {
    // 'a'が送られてきたら、角度0に設定
    case 'a':
      servo.write(0);
      break;
    // 's'が送られてきたら、角度30に設定  
    case 's':
      servo.write(30);
      break;
    // 'd'が送られてきたら、角度60に設定
    case 'd';
      servo.write(60);
      break;
    // それ以外は何もしない
    default:
      break;
  }
}


mio_k
Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away