質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
C

C言語は、1972年にAT&Tベル研究所の、デニス・リッチーが主体となって作成したプログラミング言語です。 B言語の後継言語として開発されたことからC言語と命名。そのため、表記法などはB言語やALGOLに近いとされています。 Cの拡張版であるC++言語とともに、現在世界中でもっとも普及されているプログラミング言語です。

Arduino

Arduinoは、AVRマイコン、単純なI/O(入出力)ポートを備えた基板、C言語を元としたArduinoのプログラム言語と、それを実装した統合開発環境から構成されたシステムです。

Q&A

解決済

2回答

2691閲覧

Arduino Mega 2560の20,21番ピンを用いた静電容量タッチが取得できない

moger1339

総合スコア13

C

C言語は、1972年にAT&Tベル研究所の、デニス・リッチーが主体となって作成したプログラミング言語です。 B言語の後継言語として開発されたことからC言語と命名。そのため、表記法などはB言語やALGOLに近いとされています。 Cの拡張版であるC++言語とともに、現在世界中でもっとも普及されているプログラミング言語です。

Arduino

Arduinoは、AVRマイコン、単純なI/O(入出力)ポートを備えた基板、C言語を元としたArduinoのプログラム言語と、それを実装した統合開発環境から構成されたシステムです。

1グッド

0クリップ

投稿2018/10/09 22:35

編集2018/10/09 22:45

前提・実現したいこと

Arduino Mega 2560の20番、21番ピンを用いて、タッチセンサを実装したいと考えています。
前提として、上記以外のデジタル入出力ピンは他の用途に使うため、利用不可です。

回路は下図のとおりです。
Arduino Megaを用いたタッチセンサ。抵抗の20番ピン側がタッチ点となっています。

発生している問題・エラーメッセージ

Arduino Mega 2560の20番、21番ピンを用いた静電容量タッチが動作しない状況です。
下記プログラムでは、20番ピン側の抵抗の足をタッチしても、出力値が0のままになってしまいます。

※20番,21番ピン以外のデジタル入出力ピンを用いる場合は正しく動作します。

該当のソースコード

Arduino

1void setup(){ 2 //モニタリングのためシリアル通信開始 3 Serial.begin(9600); 4 //21番ピンをデジタル出力 5 pinMode(21,OUTPUT); 6 //20番ピンをデジタル入力 7 pinMode(20,INPUT); 8} 9 10void loop(){ 11 //静電容量変化量の変数を用意 12 int a=0; 13 //21番ピンをHIGHで出力 14 digitalWrite(21, HIGH); 15 //指が触れたとき20番ピンがHIGHになるまでをカウント 16 while (digitalRead(20)!=HIGH){ 17 //カウントする 18 a++; 19 } 20 delay(1); 21 //21番ピンをLOWにする 22 digitalWrite(21, LOW); 23 //モニタリング:値を出力 24 Serial.println(a); 25}

試したこと

  • 上記プログラムが別のGPIOピンでは正常に動作することを確認(=回路,ロジック上の問題は無い)
  • 別のArduino Mega 2560でも同様に動作しなかった(=Arduino Megaは故障していない)

補足情報

個人的には、20番、21番ピンがI2C用のピンであることが何か関係するのかもと考え、
色々調査したのですが、特に解決策を見つけることは出来ませんでした。

なお、上記プログラムにおいて参考にしたページはhttp://kousaku-kousaku.blogspot.com/2008/10/arduino.htmlです。

masukin👍を押しています

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答2

0

ベストアンサー

I2Cというとプルアップ抵抗が怪しいです。
schematicをググってみますと、案の定10kΩが付いているようです。
https://circuit-diagramz.com/circuit-diagram-arduino-mega-2560/

投稿2018/10/10 11:45

ikadzuchi

総合スコア3047

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

moger1339

2018/10/11 00:49

回答ありがとうございます。 試しに、19,20,21番ピンをそれぞれINPUTモードにした上で、 それぞれで開放状態のdigitalReadを行ってみましたところ、 19番ピンはLOWでしたが、20番、21番ピンはHIGHが出力されました。 おそらくこれが原因で、タッチした際にタッチポイント側の端子にも電圧が掛かっているために 想定する動作になっていないのかもしれません。 入力状態の20番、21番ピンのプルアップ抵抗を無効化する方法があれば良いのですが… 一応、pinmodeをOUTPUTにしてもdigitalReadが行えるようなので 20番ピンをOUTPUTにして、LOWを出力すればタッチポイント側の端子に電圧が掛からないようなのですが どうにもこれでは静電容量タッチが取得できないようです。(タッチし続けてもHIGHにならない) おそらく、内部でGNDに接地されているのでタッチしても電荷が溜まらないのだと思うのですが…
ozwk

2018/10/11 01:05

外付け部品でプルアップ抵抗がついているので 無効化はプログラム的にどうこうできるものじゃないです。
moger1339

2018/10/11 01:18

>ozwkさん コメントありがとうございます。 代替案を探すことに致します。
guest

0

何もしない状態で21ピンをHighにしたとき、20ピンはHighになるでしょうか。
それがならない場合、20ピンは出力に設定されている、あるいは、なにか外部回路がつながっている、ということになります

本当に20ピンが入力になっているかをまずチェックしてみましょう

投稿2018/10/10 04:53

y_waiwai

総合スコア87774

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

moger1339

2018/10/11 00:22

回答ありがとうございます。 例えば、20番ピンと21番ピンをジャンパで短絡し、下に記述するプログラムを実行したとき、 以下のような出力になりました。 21->HIGH...HIGH 21->LOW...LOW 21->HIGH...HIGH ︙ 20番ピンによるdigitalReadの出力値は、21番ピンの出力値と同じものになっています。 そのため、20番ピンは正しく入力状態にあると思われます。 ----- void setup() { pinMode(21, OUTPUT); pinMode(20,INPUT); Serial.begin(4800); } void loop() { Serial.print("21->HIGH..."); //21pinをHighに digitalWrite(21, HIGH); delay(1000); check_input(); //20pinでチェック Serial.print("21->LOW..."); //21pinをLowに digitalWrite(21, LOW); delay(1000); //20pinでチェック check_input(); } void check_input(){ if(digitalRead(20)==HIGH){ Serial.println("HIGH"); }else{ Serial.println("LOW"); } }
y_waiwai

2018/10/11 00:59

プルアップ抵抗がついていると言うなら、そのピンでの静電検知はあきらめてください。 どうしてもというなら、半田ごて持ってきて、そのプルアップ抵抗を外すしかないですが。
moger1339

2018/10/11 01:17

そうですね、個人的にもこれ以上打つ手が無いと感じていました。 回答ありがとうございました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問