858294_ja-JP

キャンセル
次の結果を表示 
表示  限定  | 次の代わりに検索 
もしかして: 

858294_ja-JP

858294_ja-JP

1つのArduinoに2つのMPR121センサを搭載 -> シリアル通信<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />

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);
}

タッチ・センサRe: 2 mpr121 sensors in one arduino -> serial communication

私は 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

Re: 2 mpr121 sensors in one arduino -> serial communication

2 つの MPR121 ボードを、アドレス 0x5C と 0x5A で Arduino Uno にコネクテッドしました。ボードは正しく認識されています。ただし、両方のボードを AUTOCONFIG モードに設定する方法と、両方のボード上の各センサの TOUCH および RELEASE しきい値を調整する方法を理解したいと思います。現時点では、これらの設定を行うために .CPP ファイルを使用していますが、0x5a アドレス ボードでのみ機能するようです。ありがとう!

Re: 2 mpr121 sensors in one arduino -> serial communication<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />

こんにちは、ジンさん

4 つの MPR121 センサすべてを同じ I2Cバスに接続できたと聞いてうれしく思います。


現在の質問についてはよく分かりませんが、現在通信しているセンサのアドレスに応じて、ソフトウェアで簡単に実行できると思います。


よろしくお願いいたします。

トーマス

Re: 2 mpr121 sensors in one arduino -> serial communication<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />

ヴァチェルカ氏

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);
}

 

Re: 2 mpr121 sensors in one arduino -> serial communication<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />

こんにちは、ジンさん

はい、同じ I2Cバス 上の 2 つの MPR121 センサ と通信して、タッチ ボタンの数を最大 24 個まで拡張できます。

実際には、ADDR ピンの接続に応じて、MPR121 に 4 つの I2C アドレスを割り当てCANます。

pastedImage_2.png 


たとえば、1 つの MPR121 スレーブは、ADDR=VDD の場合に 7 ビットの I2C アドレス 0x5A (書き込みの場合は 0xB4、読み取りの場合は 0xB5 に変換されます) を持ち、もう 1 つの MPR121 スレーブは ADDR=GND の場合に 0x5B (書き込みの場合は 0xB6、読み取りの場合は 0xB7 に変換されます) を持ちます。


お役に立てれば幸いです!

よろしくお願いいたします。

トーマス

タグ(1)
評価なし
バージョン履歴
最終更新日:
‎11-21-2025 09:07 AM
更新者: