技術解説

実用アナログ回路

新着テーマ

技術解説 アナログ多値入力回路 2

PDFダウンロード

実用アナログ回路

アナログ多値入力回路 2

前回は、アナログによる多値入力の基本例を紹介しました。本稿では、基本回路を応用発展してロータリーエンコーダのスイッチ回路を用いた任意に4桁とか5桁の桁の整数値を入力する例を紹介します。

桁数の大きな整数値の入力をするには

前述したアナログ入力判定回路を応用として、10進数のBCDロータリーエンコーダを使用して桁数の大きな整数値の入力を行う例を紹介します。

ロータリーエンコーダのCOM端子とVCCの間にTop抵抗R5を接続し、4bitの各端子にR1,R2,R3,R4の抵抗を対GNDへ接続します。これで、前述のラダー抵抗DACと同じ考え方でアナログ判定が可能になります。

10進数のBCDロータリーエンコーダを使用したスイッチ回路

下表に10進数に応じたロータリーエンコーダの各ポジション位置でのADCへ入力される電圧値を示します。

10進数に応じたロータリーエンコーダの各ポジション位置でのADCへ入力される電圧値

例えば、4桁(0~9999)の整数値入力回路を形成するには、回路を4個用意し、各々を1の位、10の位、100の位、1000の位用に使用します。この場合、各桁用にADC入力が必要になりますので4本のADC入力端子を使用することになります。

BCDロータリーエンコーダとMCUを使用した5桁数入力回路の実例

MCUに小型マイコンボードとして普及しているArduinoシリーズのArduino Nanoを使用した回路例を示します。

ArduinoシリーズのArduino Nanoを使用した回路例

●小型AVRマイコンボード Arduino Nano

小型AVRマイコンボード Arduino Nano

同回路を実際に組み込んだ例

●INEDLaboratry社製ZCK-200基板

INEDLaboratry社製ZCK-200基板

この5桁の数値化をソフトウェアで行う処理は、下記の様になります。

  1. ロータリーエンコーダでのDAC値をADCで計測し10進数の値にします。
  2. 各桁毎の桁処理を行います。 この場合、0.1の桁、1の桁、10の桁、100の桁、1000の桁と 5つの数値を求め変数値に代入しておきます。
  3. 最終的に5つの変数値を総加算して、5桁の整数値を求めます。
Arduinoのプログラム例

参考例として上記回路でArduino Nanoで実行処理するプログラム例を下記に記載します。

==(↓ここから)=========================================

  1. /**
  2. * 5digit Analog input
  3. * use Arduino Nano
  4. **/
  5. int analogPin1 = 1; // digit1 R-SW1で生成のanalog値を読む端子A1
  6. int vin1 = 0; // digit1 読み取った値を格納する変数
  7. int analogPin2 = 2; // digit2 R-SW2で生成のanalog値を読む端子A2
  8. int vin2 = 0; // digit2 読み取った値を格納する変数
  9. int analogPin3 = 3; // digit3 R-SW3で生成のanalog値を読む端子A3
  10. int vin3 = 0; // digit3 読み取った値を格納する変数
  11. int analogPin4 = 6; // digit4 R-SW4で生成のanalog値を読む端子A6
  12. int vin4 = 0; // digit4 読み取った値を格納する変数
  13. int analogPin5 = 7; // digit5 R-SW5で生成のanalog値を読む端子A7
  14. int vin5 = 0; // digit5 読み取った値を格納する変数
  15. float ain1;
  16. float ain2;
  17. float ain3;
  18. float ain4;
  19. float ain5;
  20. float dig1;
  21. float dig2;
  22. float dig3;
  23. float dig4;
  24. float dig5;
  25. float dig;
  26. float tout;
  27. float duty;
  28. void setup() {
  29. }
  30. void loop() {
  31. //digit1 1000の桁
  32. vin1 = analogRead(analogPin1); // digit1 1000の桁を読み取る
  33. ain1 = vin1*0.004714;
  34. if ((ain1 > 3.27)&&(ain1 < 3.33)) {
  35. dig1 = 0;
  36. }
  37. if ((ain1 > 1.89)&&(ain1 < 1.92)) {
  38. dig1 = 1000;
  39. }
  40. if ((ain1 > 3.07)&&(ain1 < 3.09)) {
  41. dig1 = 2000;
  42. }
  43. if ((ain1 > 1.81)&&(ain1 < 1.84)) {
  44. dig1 = 3000;
  45. }
  46. if ((ain1 > 2.87)&&(ain1 < 2.9)) {
  47. dig1 = 4000;
  48. }
  49. if ((ain1 > 1.73)&&(ain1 < 1.78)) {
  50. dig1 = 5000;
  51. }
  52. if ((ain1 > 2.69)&&(ain1 < 2.73)) {
  53. dig1 = 6000;
  54. }
  55. if ((ain1 > 1.67)&&(ain1 < 1.71)) {
  56. dig1 = 7000;
  57. }
  58. if ((ain1 > 2.6)&&(ain1 < 2.62)) {
  59. dig1 = 8000;
  60. }
  61. if ((ain1 > 1.635)&&(ain1 < 1.66)) {
  62. dig1 = 9000;
  63. }
  64. //digit2 100の桁
  65. vin2 = analogRead(analogPin2); // digit2 100の桁を読み取る
  66. ain2 = vin2*0.004714;
  67. if ((ain2 > 3.27)&&(ain2 < 3.33)) {
  68. dig1 = 0;
  69. }
  70. if ((ain2 > 1.89)&&(ain2 < 1.92)) {
  71. dig2 = 100;
  72. }
  73. if ((ain2 > 3.07)&&(ain2 < 3.09)) {
  74. dig2 = 200;
  75. }
  76. if ((ain2 > 1.81)&&(ain2 < 1.84)) {
  77. dig2 = 300;
  78. }
  79. if ((ain2 > 2.87)&&(ain2 < 2.9)) {
  80. dig2 = 400;
  81. }
  82. if ((ain2 > 1.73)&&(ain2 < 1.78)) {
  83. dig2 = 500;
  84. }
  85. if ((ain2 > 2.69)&&(ain2 < 2.73)) {
  86. dig2 = 600;
  87. }
  88. if ((ain2 > 1.67)&&(ain2 < 1.71)) {
  89. dig2 = 700;
  90. }
  91. if ((ain2 > 2.6)&&(ain2 < 2.62)) {
  92. dig2 = 800;
  93. }
  94. if ((ain2 > 1.635)&&(ain2 < 1.66)) {
  95. dig2 = 900;
  96. }
  97. //digit3 10の桁
  98. vin3 = analogRead(analogPin3); // digit3 10の桁を読み取る
  99. ain3 = vin3*0.004714;
  100. if ((ain3 > 3.27)&&(ain3 < 3.33)) {
  101. dig3 = 0;
  102. }
  103. if ((ain3 > 1.89)&&(ain3 < 1.92)) {
  104. dig3 = 10;
  105. }
  106. if ((ain3 > 3.07)&&(ain3 < 3.09)) {
  107. dig3 = 20;
  108. }
  109. if ((ain3 > 1.81)&&(ain3 < 1.84)) {
  110. dig3 = 30;
  111. }
  112. if ((ain3 > 2.87)&&(ain3 < 2.9)) {
  113. dig3 = 40;
  114. }
  115. if ((ain3 > 1.73)&&(ain3 < 1.78)) {
  116. dig3 = 50;
  117. }
  118. if ((ain3 > 2.69)&&(ain3 < 2.73)) {
  119. dig3 = 60;
  120. }
  121. if ((ain3 > 1.67)&&(ain3 < 1.71)) {
  122. dig3 = 70;
  123. }
  124. if ((ain3 > 2.6)&&(ain3 < 2.62)) {
  125. dig3 = 80;
  126. }
  127. if ((ain3 > 1.635)&&(ain3 < 1.66)) {
  128. dig3 = 90;
  129. }
  130. //digit4 1の桁
  131. vin4 = analogRead(analogPin4); // digit4 1の桁を読み取る
  132. ain4 = vin4*0.004714;
  133. if ((ain4 > 3.27)&&(ain4 < 3.33)) {
  134. dig4 = 0;
  135. }
  136. if ((ain4 > 1.89)&&(ain4 < 1.92)) {
  137. dig4 = 1;
  138. }
  139. if ((ain4 > 3.07)&&(ain4 < 3.09)) {
  140. dig4 = 2;
  141. }
  142. if ((ain4 > 1.81)&&(ain4 < 1.84)) {
  143. dig4 = 3;
  144. }
  145. if ((ain4 > 2.87)&&(ain4 < 2.9)) {
  146. dig4 = 4;
  147. }
  148. if ((ain4 > 1.73)&&(ain4 < 1.78)) {
  149. dig4 = 5;
  150. }
  151. if ((ain4 > 2.69)&&(ain4 < 2.73)) {
  152. dig4 = 6;
  153. }
  154. if ((ain4 > 1.67)&&(ain4 < 1.71)) {
  155. dig4 = 7;
  156. }
  157. if ((ain4 > 2.6)&&(ain4 < 2.62)) {
  158. dig4 = 8;
  159. }
  160. if ((ain4 > 1.635)&&(ain4 < 1.66)) {
  161. dig4 = 9;
  162. }
  163. //digit5 0.1の桁
  164. vin5 = analogRead(analogPin5); // digit5 0.1の桁を読み取る
  165. ain5 = vin5*0.004714;
  166. if ((ain5 > 3.27)&&(ain5 < 3.33)) {
  167. dig5 = 0;
  168. }
  169. if ((ain5 > 1.89)&&(ain5 < 1.92)) {
  170. dig5 = 0.1;
  171. }
  172. if ((ain5 > 3.07)&&(ain5 < 3.09)) {
  173. dig5 = 0.2;
  174. }
  175. if ((ain5 > 1.81)&&(ain5 < 1.84)) {
  176. dig5 = 0.3;
  177. }
  178. if ((ain5 > 2.87)&&(ain5 < 2.9)) {
  179. dig5 = 0.4;
  180. }
  181. if ((ain5 > 1.73)&&(ain5 < 1.78)) {
  182. dig5 = 0.5;
  183. }
  184. if ((ain5 > 2.69)&&(ain5 < 2.73)) {
  185. dig5 = 0.6;
  186. }
  187. if ((ain5 > 1.67)&&(ain5 < 1.71)) {
  188. dig5 = 0.7;
  189. }
  190. if ((ain5 > 2.6)&&(ain5 < 2.62)) {
  191. dig5 = 0.8;
  192. }
  193. if ((ain5 > 1.635)&&(ain5 < 1.66)) {
  194. dig5 = 0.9;
  195. }
  196. dig = dig1 + dig2 + dig3 + dig4 + dig5;
  197. }

==(↑ここまで)========================================