第 3 回 C++言語演習解答

3-3. まとめの演習

演習3-1

Blink.ino のプログラムを改造して、点滅の速さが2倍になるようにしよう


void setup() {
  pinMode(LED_BUILTIN, OUTPUT);
}
void loop() {
  digitalWrite(LED_BUILTIN, HIGH);
  delay(500);
  digitalWrite(LED_BUILTIN, LOW); 
  delay(500);
}

演習3-2

Blink.ino のプログラムを改造して、点滅の速さが1/2倍になるようにしよう


void setup() {
  pinMode(LED_BUILTIN, OUTPUT);
}
void loop() {
  digitalWrite(LED_BUILTIN, HIGH);
  delay(2000);
  digitalWrite(LED_BUILTIN, LOW); 
  delay(2000);
}

演習3-3

与えた数だけ、0.1秒ずつLEDを点滅した後、1秒消灯する void nblink(byte n) 関数を作りなさい。 また、 次のプログラムと結合して正常に動作することを確かめなさい。


void nblink(byte n);
void setup(){
  pinMode(LED_BUILTIN, OUTPUT);
}
void loop(){
  static byte i=0;
  nblink(++i);
  i %= 4;
}

void nblink(byte n){
  for(byte i=0;i<n;i++){
    digitalWrite(LED_BUILTIN, HIGH);
    delay(100);                     
    digitalWrite(LED_BUILTIN, LOW); 
    delay(100);  
  }
  delay(900);
}

演習3-4

初期化の時に数を与え、blink()メソッドを呼ぶと、与えた数だけ、0.1秒ずつLEDを点滅した後、1秒消灯するクラス Led を作りなさい。 また、 次のプログラムと結合して正常に動作することを確かめなさい。


#include "Led.h"
Led *list[]={new Led(3), new Led(3), new Led(7)};
void setup() {
  pinMode(LED_BUILTIN, OUTPUT);
}
void loop(){
  static byte i=0;
  list[i++]->blink();
  i %= sizeof(list)/sizeof(list[0]);
}
Led.h

#include "Arduino.h"
class Led {
  byte kaisuu;
  public:
  Led(byte n);
  void blink();
};
Led.cpp

#include "Arduino.h"
#include "Led.h"
Led::Led(byte n):kaisuu(n){
}
void Led::blink(){
  for(byte i=0;i<kaisuu;i++){
    digitalWrite(LED_BUILTIN, HIGH);
    delay(100);                    
    digitalWrite(LED_BUILTIN, LOW);
    delay(100);  
  }
  delay(900);
}

演習3-5

volatile 宣言を外すと動きがどう変化するか確かめよう。

まずvolatile 宣言の演習をしてみましょう。 スケッチ例の Blink のプログラムの delayを、 自作の1秒待つ関数 mydelay で置き換えよう。 以下のプログラムで1秒点灯するように ??? の部分に数字を入れよう。

mydelay

void setup(){
  pinMode(LED_BUILTIN,OUTPUT);    
}
void mydelay(){
for(volatile long i=0; i< ???; i++){
  }
}
void loop(){
  digitalWrite(LED_BUILTIN, HIGH);
  mydelay();
  delay(10);
  digitalWrite(LED_BUILTIN, LOW);
  delay(1000);
}

次に、上記のvolatileを外して、動作を確かめよう。

演習3-6

4番とGNDをつないだときだけ、LED が点灯するプログラムを作りなさい。


#define INPORT 4
void setup() {
  pinMode(LED_BUILTIN,OUTPUT);
  pinMode(INPORT,INPUT_PULLUP);
}
void loop() {
  digitalWrite(LED_BUILTIN,!digitalRead(INPORT));
  delay(1);
}

演習3-7

4番とGNDをつないだときは、1秒おきに2回LEDが点滅、つないでない時は 1秒おきに短くLEDが点滅するプログラムを作りなさい。


#define INPORT 4
void nblink(byte n){
  for(byte i=0;i<n;i++){
    digitalWrite(LED_BUILTIN, HIGH);
    delay(100);                     
    digitalWrite(LED_BUILTIN, LOW); 
    delay(100);  
  }
  delay(900);
}
void setup() {
  pinMode(LED_BUILTIN,OUTPUT);
  pinMode(INPORT,INPUT_PULLUP);
}
void loop() {
  nblink(2-digitalRead(INPORT));
}

演習3-8

4番とGNDをつないだときは、1秒おきにLEDが1回点滅、2回点滅、3回点滅、 1回点滅,2回点滅、3回点滅と繰り返すが、 つないでない時は同じ回数の点滅を繰り返すプログラムを作りなさい。 つまり、3回点滅の時に線を外せば、そのまま3回点滅を繰り返し、 1回点滅の時に線を外すと1回点滅を繰り返すようにしなさい。


#define INPORT 4
void nblink(byte n){
  for(byte i=0;i<n;i++){
    digitalWrite(LED_BUILTIN, HIGH);
    delay(100);                     
    digitalWrite(LED_BUILTIN, LOW); 
    delay(100);  
  }
  delay(900);
}
void setup() {
  pinMode(LED_BUILTIN,OUTPUT);
  pinMode(INPORT,INPUT_PULLUP);
}
void loop() {
  static int i=0;
  nblink(i+1);
  i=(i+1-digitalRead(INPORT))%3;
}

坂本直志 <sakamoto@c.dendai.ac.jp>
東京電機大学工学部情報通信工学科