2つの(0x5A、0x5B)アドレスを接続しようとしています。
コードとデータシートには、addr ピンを (デフォルト、3.3 V) に接続するだけで通信が可能になると記載されています。
Arduino は他のセンサを認識しますが、一度に 2 つのタッチ センサを読み取ることはできません。i=0 ~ 11 とだけ表示されます
i=12~23 を実行するにはどうすればよいですか?
コード内で 2 つのセンサを区別するにはどうすればよいでしょうか?
mpr121 センサ同士で通信することは可能ですか?
1 つの Arduino に 2 つのセンサを接続する方法を本当に知りたいです。
配線を確認するためにi2cスキャナも試しました
奇妙なことに、シリアル モニターは 1 つのセンサしか表示しません。
これが私のコードです
区別するために最初に何か定義を追加する必要がありますか?
または
ループを変更する
のために{
}
できるだけ早く教えてくださいX(
------------------------------------------------------------------------------------------------------------------------------------
#include "SoftwareSerial.h"
//#define defaultPatch 15 //악기 초기화 버튼 설정 악기번호
ソフトウェアシリアル mySerial(2, 3); //SW の機能 D3 MIDI 機能、D2 の機能
バイトノート = 0; //MIDI 연주될 ノート(음계)
バイトリセットMIDI = 4; // VS1053 リセット
バイトledPin = 13; //MIDI 트래픽 표시용 LED
#include
#include "Adafruit_MPR121.h"
#ifndef _BV
#define _BV(ビット) (1 << (ビット))
#endif
Adafruit_MPR121 キャップ = Adafruit_MPR121();
#MPR121addr 0x5A を定義する
#MPR121addr 0x5B を定義する
uint16_t 最後にタッチされた = 0;
uint16_t currtouched = 0;
#include
int btn[]={60, 62, 64, 65, 67,69, 71, 72, 74, 76, 77, 79,
81、83、84、86、88、89、91、93、95、96、98、100};
バイト byteData;
void セットアップ() {
シリアル.begin(9600);
mySerial.begin(9600);
/* while (!Serial) { // leonardo/micro が高速に起動しないようにするために必要です!
遅延(10);
}
*/
Serial.println("Adafruit MPR121 静電容量式タッチセンサーテスト");
// デフォルトのアドレスは 0x5A です。3.3V に接続されている場合は 0x5B です。
// SDAに接続されている場合は0x5C、SCLに接続されている場合は0x5D
if (!cap.begin(0x5A)) {
シリアル.println("MPR121-A見つかりません。配線を確認してください。");
(1)の間
}
シリアル.println("MPR121-A見つかった!");
//
if (!cap.begin(0x5B)) {
シリアル.println("MPR121-B見つかりません。配線を確認してください。");
(1)の間
}
シリアル.println("MPR121-B見つかった!");
//VS1053をリセットする
pinMode(resetMIDI, OUTPUT);
digitalWrite(resetMIDI, LOW);
遅延(100);
digitalWrite(resetMIDI, HIGH);
遅延(100);
}
void loop() {
currtouched = cap.touched();
(uint8_t i=0; i<12; i++) の場合 {
// タッチされたが、以前はタッチされていなかった場合は警告!
if ((currenttouched & _BV(i)) && !(lasttouched & _BV(i)) ) {
シリアル.print(i);シリアル.println("触れた");
// トーン(0, btn[i],100);
noteOn(0, btn[i],100);
//tone(ブザーピン、周波数[i]、330);
}
}
(uint8_t i=12; i<24; i++) の場合 {
// タッチされたが、以前はタッチされていなかった場合は警告!
if ((currenttouched & _BV(i)) && !(lasttouched & _BV(i)) ) {
Serial.print(i); Serial.println(" タッチされました");
// トーン(0, btn[i],100);
noteOn(0, btn[i],100);
//tone(ブザーピン、周波数[i]、330);
}
}
//*************** MIDI ループバック ******************//
if(Serial.available()> 0)
{
byteData = Serial.read();
mySerial.write(バイトデータ);
}
lasttouched = currtouched;
戻る;
}
//MIDI ノートオン メッセージを送信します。ピアノの鍵盤を押すように
//チャネルの範囲は0~15
void noteOn(バイトチャネル、バイトノート、バイトアタックベロシティ) {
talkMIDI( (0x90 | チャネル), ノート, attack_velocity);
}
//MIDI ノートオフ メッセージを送信します。ピアノの鍵盤を放すように
void noteOff(バイトチャネル、バイトノート、バイトリリースベロシティ) {
talkMIDI( (0x80 | チャネル), ノート, release_velocity);
}
//MIDI ノートを再生します。cmd が 127 より大きいか、データ値が 127 より小さいかをチェックしません。
void talkMIDI(バイトコマンド、バイトデータ1、バイトデータ2) {
digitalWrite(ledPin, HIGH);
mySerial.write(コマンド);
mySerial.write(データ1);
// 一部のコマンドにはデータ バイトが 1 つしかありません。0xBn未満のすべてのコマンドは2つのデータバイトを持ちます
//(ある意味: http://253.ccarh.org/handout/midiprotocol/)
if( (コマンド & 0xF0) <= 0xB0)
mySerial.write(data2);
digitalWrite(ledPin, LOW);
}
私は MPR121 を 1 つしか持っていない、SO コードを試すことができませんでしたが、以下のように変更する必要があると思います。
(uint8_t i=0; i<12; i++) の場合 {
// タッチされたが、以前はタッチされていなかった場合は警告!
if ((currenttouched & _BV(i)) && !(lasttouched & _BV(i)) ) {
シリアル.print(i);シリアル.println("触れた");
// トーン(0, btn[i],100);
noteOn(0, btn[i],100);
//tone(ブザーピン、周波数[i]、330);
}
}
(uint8_t i=0; i<12; i++) の場合 {
// タッチされたが、以前はタッチされていなかった場合は警告!
if (( currtouched2 & _BV(i)) && !(lasttouched2 & _BV(i)) ) {
//センサーがタッチされたら何かする
シリアル.print( i+12 );シリアル.println("触れた");
noteOn(0, btn[i],100);
}
}
MPR121 には 12 個の入力があり、_BV(bit) ビット パラメータは常に 0 ~ 12 の範囲である必要があり、 currtouched2を使用して異なる ADDR を選択します。
Lib の 230 行目: https://github.com/adafruit/Adafruit_MPR121/blob/master/Adafruit_MPR121.cpp
2 つの MPR121 ボードを、アドレス 0x5C と 0x5A で Arduino Uno にコネクテッドしました。ボードは正しく認識されています。ただし、両方のボードを AUTOCONFIG モードに設定する方法と、両方のボード上の各センサの TOUCH および RELEASE しきい値を調整する方法を理解したいと思います。現時点では、これらの設定を行うために .CPP ファイルを使用していますが、0x5a アドレス ボードでのみ機能するようです。ありがとう!
こんにちは、ジンさん
4 つの MPR121 センサすべてを同じ I2Cバスに接続できたと聞いてうれしく思います。
現在の質問についてはよく分かりませんが、現在通信しているセンサのアドレスに応じて、ソフトウェアで簡単に実行できると思います。
よろしくお願いいたします。
トーマス
ヴァチェルカ氏
SO ありがとうございます!!
接続が可能とのことで安心しました。
ご親切なご返信のおかげで、mpr121センサ4個全てを接続することができました!!
私が直面している最後の問題は、「タッチボタンの数を最大 24 個まで拡張する」ことです。
各タッチセンサは 0 から 11 までの値を返します。
0-11、12-23、24-35、36-47 にするにはどうすればいいですか?
-----------------------------------------------------------------------------------------------------------------------------------------------------
#include "SoftwareSerial.h"
//#define defaultPatch 15 //악기 초기화 버튼 설정 악기번호
ソフトウェアシリアル mySerial(2, 3); //SW の機能 D3 MIDI 機能、D2 の機能
バイトノート = 0; //MIDI 연주될 ノート(음계)
バイトリセットMIDI = 4; // VS1053 リセット
バイトledPin = 13; //MIDI 트래픽 표시용 LED
#include
#include "Adafruit_MPR121.h"
#ifndef _BV
#define _BV(ビット) (1 << (ビット))
#endif
// 1 つの I2Cバス に最大 4 つまで接続できますが、テストには 1 つで十分です。
Adafruit_MPR121 キャップ = Adafruit_MPR121();
Adafruit_MPR121 cap2 = Adafruit_MPR121();
Adafruit_MPR121 cap3 = Adafruit_MPR121();
Adafruit_MPR121 cap4 = Adafruit_MPR121();
// 最後にタッチされたピンを追跡します
// SO ボタンが「放された」ことが分かる
uint16_t 最後にタッチされた = 0;
uint16_t currtouched = 0;
uint16_t lasttouched2 = 0;
uint16_t currtouched2 = 0;
uint16_t lasttouched3 = 0;
uint16_t currtouched3 = 0;
uint16_t lasttouched4 = 0;
uint16_t currtouched4 = 0;
int btn[]={21, 23, 24, 26, 28, 29, 31, 33, 35, 36, 38, 40,
41、43、45、47、48、50、52、53、55、57、59、60、
62、64、65、67、69、71、72、74、76、77、79、81、
83、84、86、88、89、91、93、95、96、98、100、101};
バイト byteData;
void セットアップ() {
シリアル.begin(9600);
mySerial.begin(9600);
while (!Serial) { // leonardo/micro が高速に起動しないようにするために必要です。
遅延(10);
}
Serial.println("Adafruit MPR121 静電容量式タッチセンサテスト");
// デフォルトのアドレスは 0x5A です。3.3V に接続されている場合は 0x5B です。
// SDAに接続されている場合は0x5C、SCLに接続されている場合は0x5D
if (!cap.begin(0x5A)) {
シリアル.println("MPR121-A見つかりません。配線を確認してください。");
(1)の間
}
シリアル.println("MPR121-A見つかった!");
//
もし(!cap2.begin(0x5B)){
シリアル.println("MPR121-B見つかりません。配線を確認してください。");
(1)の間
}
シリアル.println("MPR121-B見つかった!");
//
if (!cap3.begin(0x5C)){
シリアル.println("MPR121-C見つかりません。配線を確認してください。");
(1)の間
}
シリアル.println("MPR121-C見つかった!");
//
もし(!cap4.begin(0x5D)){
シリアル.println("MPR121-D見つかりません。配線を確認してください。");
(1)の間
}
シリアル.println("MPR121-D見つかった!");
//VS1053をリセットする
pinMode(resetMIDI, OUTPUT);
digitalWrite(resetMIDI, LOW);
遅延(100);
digitalWrite(resetMIDI, HIGH);
遅延(100);
// これはループ内にあるので、ボードをホットプラグできます
// ホットプラグインが必要ない場合は、setup() に配置できます。
キャップの開始(0x5A);
cap2.begin(0x5B);
cap3.begin(0x5C);
cap4.begin(0x5D);
}
void loop() {
// 現在タッチされているパッドを取得します
currtouched = cap.touched();
currtouched2 = cap2.touched();
currtouched3 = cap3.touched();
currtouched4 = cap4.touched();
(uint8_t i=0; i<48; i++) の場合 {
// タッチされたが、以前はタッチされていなかった場合は警告!
if ((currenttouched & _BV(i)) && !(lasttouched & _BV(i)) ) {
Serial.print(i); Serial.println(" タッチされました");
// トーン(0, btn[i],100);
noteOn(0, btn[i],100);
//tone(ブザーピン、周波数[i]、330);
}
//2///////////////////////////////////////////////////
if ((currtouched2 & _BV(i)) && !(lasttouched2 & _BV(i)) ) {
//センサがタッチされたら何かする
Serial.print(i); Serial.println(" タッチされました");
noteOn(0, btn[i],100);
}
//3///////////////////////////////////////////////////
if ((currtouched3 & _BV(i)) && !(lasttouched3 & _BV(i)) ) {
//センサがタッチされたら何かする
Serial.print(i); Serial.println(" タッチされました");
noteOn(0, btn[i],100);
}
//4///////////////////////////////////////////////////
if ((currtouched4 & _BV(i)) && !(lasttouched4 & _BV(i)) ) {
//センサがタッチされたら何かする
Serial.print(i); Serial.println(" タッチされました");
noteOn(0, btn[i],100);
}
}
// 状態をリセットする
lasttouched = currtouched;
最後にタッチした2 = 現在タッチした2;
lasttouched3 = currtouched3;
最後にタッチした4 = 現在タッチした4;
戻る;
//*************** MIDI ループバック ******************//
if(Serial.available()> 0)
{
byteData = Serial.read();
mySerial.write(バイトデータ);
}
}
//MIDI ノートオン メッセージを送信します。ピアノの鍵盤を押すように
//チャネルの範囲は0~15
void noteOn(バイトチャネル、バイトノート、バイトアタックベロシティ) {
talkMIDI( (0x90 | チャネル), ノート, attack_velocity);
}
//MIDI ノートオフ メッセージを送信します。ピアノの鍵盤を放すように
void noteOff(バイトチャネル、バイトノート、バイトリリースベロシティ) {
talkMIDI( (0x80 | チャネル), ノート, release_velocity);
}
//MIDI ノートを再生します。cmd が 127 より大きいか、データ値が 127 より小さいかをチェックしません。
void talkMIDI(バイトコマンド、バイトデータ1、バイトデータ2) {
digitalWrite(ledPin, HIGH);
mySerial.write(コマンド);
mySerial.write(データ1);
// 一部のコマンドにはデータ バイトが 1 つしかありません。0xBn未満のすべてのコマンドは2つのデータバイトを持ちます
//(ある意味: http://253.ccarh.org/handout/midiprotocol/)
if( (コマンド & 0xF0) <= 0xB0)
mySerial.write(data2);
digitalWrite(ledPin, LOW);
}
こんにちは、ジンさん
はい、同じ I2Cバス 上の 2 つの MPR121 センサ と通信して、タッチ ボタンの数を最大 24 個まで拡張できます。
実際には、ADDR ピンの接続に応じて、MPR121 に 4 つの I2C アドレスを割り当てCANます。
たとえば、1 つの MPR121 スレーブは、ADDR=VDD の場合に 7 ビットの I2C アドレス 0x5A (書き込みの場合は 0xB4、読み取りの場合は 0xB5 に変換されます) を持ち、もう 1 つの MPR121 スレーブは ADDR=GND の場合に 0x5B (書き込みの場合は 0xB6、読み取りの場合は 0xB7 に変換されます) を持ちます。
お役に立てれば幸いです!
よろしくお願いいたします。
トーマス