PASのブログ

PASの中の人が書く雑記ブログです。

アナマル③ スイッチを使おう

前回のラストではプログラムを日本語訳するという丁寧さで進めたこの連載。
流石にあのペースでやりますと半年くらいかかる気がするので、徐々に簡潔にしていく予定です。

さて、今日はスイッチを使います。

スイッチはモーメンタリを使います。

スイッチはモーメンタリを使います。

・モーメンタリ→押している間だけON (状態を保存しない)
・オルタネイト→押すとON、再度押すとOFF (状態を保存する)

このような違いがあります。
エフェクターのフットスイッチでは、主にオルタネイトを使いますし、トグルスイッチも(跳ね返りというものを除き)オルタネイト動作ですので、モーメンタリを使ったことがない方が多いかもしれませんが、オルタネイトでは出来ないことが出来ます。

○数をカウントする(1,2,3,4,.....)場合に、オルタネイトではON→OFF→ON→OFF→...となり、よくわからなくなる。
マイコンで状態を保存できるのでオルタネイトの必要がない。
マイコンでモード移行やリセットなどした場合に、ONとOFFが入れ替わってしまうと困ったりする。

言い換えると、オルタネイトでも出来るけどモーメンタリのほうが楽なんです。
3PDT(3極双頭)ではなく、SPST(1極単頭)で構いません。

例えばこんなものですね。 akizukidenshi.com

注意点としては、Arduinoのピンに挿して、スイッチを宙に浮かせて操作すると、線が抜けかかったりして状態が代わりますので、しっかり固定してから実験しましょう。

そこで、こういう物を作りました。 f:id:pas_fx:20200603194103j:plain

タクトスイッチをブレッドボードに挿し、それをジャンパワイヤーで繋ぎました。黒をGND、赤をピン(A4)に繋ぎます。
※Arduinodの下の列、A0-A5はアナログピンですが、デジタルとしても使えます。今回は入力には下の列のA0-A5を使います。

この記事をご覧になっている方はアナログ回路の自作はされたことが有ると思いますので、説明は割愛しますが、GNDがわからない場合は調べてみてください。コメントも受け付けています。

スイッチを使ってLEDを点灯させる。

さて、これを使ってまずは、「押している間だけLEDを点灯させる」ことにチャレンジします。

const int SW1 = A4;

void setup() {
  pinMode(LED_BUILTIN, OUTPUT); //LEDはとりあえず基板上のものを設定。
  pinMode(SW1,INPUT_PULLUP);//A4をデジタルポート入力でプルアップ。
}

void loop() {
 if(!digitalRead(SW1))//もしSW1がHIGHではないなら
  {
   digitalWrite(LED_BUILTIN, HIGH);   // LEDへの信号をHIGH(点灯)
  }
  else
  digitalWrite(LED_BUILTIN, LOW);    // LEDへの信号をLOW(消灯)
}

さあ、既にお持ちの方はコンパイルして書き込んでみてください。

スイッチを押している間だけLEDが点灯しますね。

それでは解説します。

データ型

const int SW1 = A4;

データ型というのは、「その数字や文字がどういうものかを定義する」ものでして、Arduinoでは以下のようなものがあります。

boolean true(1)かfalse(0)どちらか一方の値を持ちます。
char 1つの文字を記憶するために1バイトのメモリを消費する型です。「バイト」というのは後で解説します。
unsigned char cherの符号なし(unsiged)です。
byte byte型は0から255までの8bitの数値を格納します。符号なし。
int 2バイト整数型。
unsigned int  2バイト符号なし整数型。
word word型は符号無し16ビットの数です。
long  4バイト整数型。
unsigned long  4バイト符号なし整数型。
float  4バイト浮動小数点型。
double  倍精度(8バイト)浮動小数点型。
void voidはその関数を呼び出した側になんの情報も返さないことを示します。

・・・何のことやらという感じですね。

これは、詳しく言うとコンピュータ内部のメモリをどれだけ確保して、その種類が何か、ということなのですが、ここでは
数はint(又はunsigned int)で、文字はchar(又はunsigned cher)とつける、と覚えましょう。とりあえず大抵それで大丈夫です。

bitとbite

ビット(bit)は、1桁のことで、それが8桁でバイト(bite)になります。
デジタルでは電気を0Vか、電源電圧(以降UNOなので5V)の二種類で表します。
0Vならば0,5Vならば1と読みます。

2進数(と16進数)

桁上りすることで、普段私達が使っている10進数と同じように2進数でも数字を表すことが出来ます。

10進数 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
2進数 0 1 10 11 100 101 110 111 1000 1001 1010 1011 1100 1101 1110 1111
16進数 0 1 2 3 4 5 6 7 8 9 A B C D E F

ご覧のように、2進数は0と1で構成されているので桁がとても大きくなります。 そこで、きりが良いところで短く表すために、16進数もよく使われています。

intとunsigned int

2進数には10進数で使う「マイナス」が無いため、数字だけでマイナスを表示します。 intは2バイト(16桁)なので、216種類の数、つまり、65536の数が表せますが、

intの場合は -32768から32767まで
unsigned intの場合は 0から65535まで
を表すことが出来ます。

const

データ型で作ったものは変数と言いまして、例えば

int a = 0;
a = 10;
a  =25;

などと書くことが出来、a = 25を実行した後のaの値は25です。

constをつけると、初回設定(初期化)をしたら、変更できません。

const int SW1 = A4;
は、SW1という名前(変数)でA4を名付けました。変更不可。

という意味です。

あかん、また長くなりすぎたので続きは次回。