. Arduinoを使った電卓の製作(1) - しなぷすのハード製作記
Arduinoを使った電卓の製作(1) - しなぷすのハード製作記
Arduinoを使った電卓の製作(1) - しなぷすのハード製作記

Arduinoを使った電卓の製作(1)

この記事で紹介している電卓を作るには、 Arduino Uno 、Arduino Mega 2560、Arduino Leonardo、Arduino Pro 328 5V 16MHz、Seeduino V3.0など、ResKeypadライブラリが対応している8ビットの Arduino (および互換機)と、 Arduino IDE 1.0.1~1.0.6、1.6.X、または1.7.X(Xは任意の数字)が必要です。

目次

10-1. 製作した電卓で扱える桁数 … 5ページ 10-2. 各ボタンの意味や働き … 5ページ 10-3. 製作した電卓の使い方と履歴表示機能 … 5ページ 10-4. 全桁訂正機能と1桁訂正機能 … 5ページ 10-5. エラーの発生と復帰 … 5ページ 10-6. 計算精度について … 5ページ 11-1. 数値を表わす文字列からfloat型への間の変換 … 6ページ 11-2. float型数値から文字列への変換 … 6ページ 11-3. 画面表示 … 6ページ 11-4. 主なグローバル変数 … 6ページ 11-5. loop関数の動作 … 6ページ

1. はじめに

  • 電卓はスイッチをたくさん使う
  • 電卓のプログラムは、簡単なようでいて、実際には結構手間がかかる

2. 電卓に必要なスイッチの数を考える

図1、必要最低限の機能の電卓のイメージ

ところで、スイッチ(ボタン)の状態をArduinoに読み込ませるには、図2の様に、 I/Oピン にスイッチおよびプルアップ抵抗をつないで、リスト1の様に digitalRead関数 で読み出すのが一般的です。

図2、プルアップ抵抗を用いたスイッチの状態の読み取り リスト1 、図2の回路のスイッチ読のみ取り用スケッチCOPY #define IO_PIN 4 // 使用するI/Oピンを指定する void setup() < pinMode(IO_PIN,INPUT); // 読み取りに使うI/Oピンを入力にする。INPUTの代わりにINPUT_PULLUPにすると、プルアップ抵抗を省略できる。 > void loop() < if(digitalRead(IO_PIN)==LOW) < // スイッチがONの時の処理 > else < // スイッチがOFFの時の処理 > // if >

リスト1の スケッチ は、一部未完成ですが、実際には // スイッチがONのときの処理 と書いてある部分と、 // スイッチがOFFの時の処理 と書いてある部分に、それぞれ必要な処理を書いて、スケッチを完成させます。

3. 電卓にはキーマトリックス方式が使われる場合が多い

図3、キーマトリックス方式の、スイッチの読み取り回路 リスト2 、キーマトリックス方式でスイッチの状態を読み取るスケッチCOPY #define IN1 0 // 入力用I/Oピンを指定する #define IN2 1 // 入力用I/Oピンを指定する #define IN3 2 // 入力用I/Oピンを指定する #define IN4 3 // 入力用I/Oピンを指定する #define OUT1 4 // 出力用I/Oピンを指定する #define OUT2 5 // 出力用I/Oピンを指定する #define OUT3 6 // 出力用I/Oピンを指定する #define OUT4 7 // 出力用I/Oピンを指定する void setup() < pinMode(IN1 ,INPUT ); // 入力用I/Oピンを入力にする。INPUTの代わりにINPUT_PULLUPにすると、プルアップ抵抗を省略できる。 pinMode(IN2 ,INPUT ); // 入力用I/Oピンを入力にする。INPUTの代わりにINPUT_PULLUPにすると、プルアップ抵抗を省略できる。 pinMode(IN3 ,INPUT ); // 入力用I/Oピンを入力にする。INPUTの代わりにINPUT_PULLUPにすると、プルアップ抵抗を省略できる。 pinMode(IN4 ,INPUT ); // 入力用I/Oピンを入力にする。INPUTの代わりにINPUT_PULLUPにすると、プルアップ抵抗を省略できる。 pinMode(OUT1,OUTPUT); // 出力用I/Oピンをハイインピーダンスにするために、入力にする。 pinMode(OUT2,OUTPUT); // 出力用I/Oピンをハイインピーダンスにするために、入力にする。 pinMode(OUT3,OUTPUT); // 出力用I/Oピンをハイインピーダンスにするために、入力にする。 pinMode(OUT4,OUTPUT); // 出力用I/Oピンをハイインピーダンスにするために、入力にする。 > void loop() < // SW1、SW5、SW9、SW13を読むために、OUT1をL、OUT2~4をハイインピーダンスにする。 pinMode(OUT4,INPUT ); // OUT4をハイインピーダンスにする。 pinMode(OUT1,OUTPUT); // OUT1を出力にする。 digitalWrite(OUT1,LOW); // OUT1にLを出力する。 delay(1); // 信号線の状態が安定するのを待つ // IN1を読み、SW1の状態を調べる if(digitalRead(IN1)==LOW) < // SW1がONの時の処理 > // if // IN2を読み、SW5の状態を調べる if(digitalRead(IN2)==LOW) < // SW5がONの時の処理 > // if // IN3を読み、SW9の状態を調べる if(digitalRead(IN3)==LOW) < // SW9がONの時の処理 > // if // IN4を読み、SW13の状態を調べる if(digitalRead(IN4)==LOW) < // SW13がONの時の処理 > // if // SW2、SW6、SW10、SW14を読むために、OUT2をL、OUT1とOUT3~4をハイインピーダンスにする。 pinMode(OUT1,INPUT ); // OUT1をハイインピーダンスにする。 pinMode(OUT2,OUTPUT); // OUT2を出力にする。 digitalWrite(OUT2,LOW); // OUT2にLを出力する。 delay(1); // 信号線の状態が安定するのを待つ // IN1を読み、SW2の状態を調べる if(digitalRead(IN1)==LOW) < // SW2がONの時の処理 > // if // IN2を読み、SW6の状態を調べる if(digitalRead(IN2)==LOW) < // SW6がONの時の処理 > // if // IN3を読み、SW10の状態を調べる if(digitalRead(IN3)==LOW) < // SW10がONの時の処理 > // if // IN4を読み、SW14の状態を調べる if(digitalRead(IN4)==LOW) < // SW14がONの時の処理 > // if // SW3、SW7、SW11、SW15を読むために、OUT3をL、OUT1~2とOUT4をハイインピーダンスにする。 pinMode(OUT2,INPUT ); // OUT2をハイインピーダンスにする。 pinMode(OUT3,OUTPUT); // OUT3を出力にする。 digitalWrite(OUT3,LOW); // OUT3にLを出力する。 delay(1); // 信号線の状態が安定するのを待つ // IN1を読み、SW3の状態を調べる if(digitalRead(IN1)==LOW) < // SW3がONの時の処理 > // if // IN2を読み、SW7の状態を調べる if(digitalRead(IN2)==LOW) < // SW7がONの時の処理 > // if // IN3を読み、SW11の状態を調べる if(digitalRead(IN3)==LOW) < // SW11がONの時の処理 > // if // IN4を読み、SW15の状態を調べる if(digitalRead(IN4)==LOW) < // SW15がONの時の処理 > // if // SW4、SW8、SW12、SW16を読むために、OUT4をL、OUT1~3をハイインピーダンスにする。 pinMode(OUT3,INPUT ); // OUT3をハイインピーダンスにする。 pinMode(OUT4,OUTPUT); // OUT4を出力にする。 digitalWrite(OUT4,LOW); // OUT4にLを出力する。 delay(1); // 信号線の状態が安定するのを待つ // IN1を読み、SW4の状態を調べる if(digitalRead(IN1)==LOW) < // SW4がONの時の処理 > // if // IN2を読み、SW8の状態を調べる if(digitalRead(IN2)==LOW) < // SW8がONの時の処理 > // if // IN3を読み、SW12の状態を調べる if(digitalRead(IN3)==LOW) < // SW12がONの時の処理 > // if // IN4を読み、SW16の状態を調べる if(digitalRead(IN4)==LOW) < // SW16がONの時の処理 > // if >

この様に、まともにキーマトリックス方式でスイッチ状態を読み取ろうとすると、長いプログラムになってしまいます。そこで、通常はスイッチの読み取り処理を関数の形でまとめてしまいます。Arduinoを使う場合は、Arduino PlaygroundのThe Matrix Keypad how-to (英文)で紹介されているKeypadライブラリ を使えば、スイッチを読み取る関数を自作する必要もありません。

このページで使われている用語の解説

関連ページ

  • I/Oピン一つで読み取れるキーパッドの製作抵抗分圧方式のキーパッドの製作記事
  • 抵抗分圧器を使った、多くのスイッチのセンシング(1)抵抗分圧方式のキーパッドの設計に関する理論の解説
  • I/Oピン一つで読めるキーパッドの設計サービス抵抗分圧方式のキーパッドを自動的に設計してくれるサービス
  • Arduino用ブートローダ/スケッチライタの製作(1)電卓を1枚の基板にまとめる時にマイコンにArduinoのスケッチを書き込むのに使うライタ

関連製品

商品名 I/Oピン一つで読める4X5キーパッドキット 税抜き小売価格 2400円 販売店 スイッチサイエンス サポートページ I/Oピン一つで読める4X5キーパッドキットサポートページ 商品名 Arduino用ブートローダ/スケッチライタキット 税抜き小売価格 3000円 販売店 スイッチサイエンス サポートページ Arduino用ブートローダ/スケッチライタキットサポートページ
📎📎📎📎📎📎📎📎📎📎