hallo,
kann es sein, dass der Serielle Monitor (USB) nicht richtig bei der Verwendung von I2C (ana 4+5) funktioniert?
Wäre das erste mal, dass ich davon höre/lese. Wo ist dein Testsketch? Vielleicht erklärt der das Verhalten...
hier sind die Codes - Arduino als slave:
(edit: pins 0+1 waren damals nicht definiert gewesen:)
// Arduino I2C slave as a port multiplexer
// version 0.25a
//
// electrical setup:
// Touch sensor at pin digital 4 (digital input) (indicated by a LED)
// 10k Potentiometer at pin analog 0 (analog input)
// 3 LEDs at digital pin 9,10,11 (3x pwm output)
// ===>>> (best: a subset of 3, 5, 6, 9, 10, 11!)
//
// i2c as slave, dev addr. 0x03
//
#include <Wire.h> // serial lib
#define NOPIN 129 // void pin address
// API constants
/*
#define INPUT 0
#define OUTPUT 1
#define LOW 0
#define HIGH 1
*/
// digital pins
byte led13 =13, // intern write
ledred = 9, // extern write
ledyellow =10, // extern write
ledgreen =11; // extern write
byte touchpin = 4; // extern read
byte i2cReply[14], // bytes: chk 0+1, ana 2+3,4+5,6+7,8+9,10+11 dig 12(0-7) + 13(8-15)
i2cInput[14]; // bytes: custom 0+1,
// p1 2, pwm1 3,
// p2 4, pwm2 5,
// p3 6, pwm3 7,
// p4 8, pwm4 9,
// p5 10, pwm5 11,
// p6 12, pwm6 13
//***********************************************************************************************
//***********************************************************************************************
void setup()
{
// digital pins, default settings: customizable
pinMode( 2, INPUT);
pinMode( 3, OUTPUT); // pwm
pinMode( 4, INPUT);
pinMode( 5, OUTPUT); // pwm
pinMode( 6, OUTPUT); // pwm
pinMode( 7, INPUT);
pinMode( 8, INPUT);
pinMode( 9, OUTPUT); // pwm
pinMode(10, OUTPUT); // pwm
pinMode(11, OUTPUT); // pwm
pinMode(12, INPUT);
pinMode(13, OUTPUT); // LED internal
Wire.begin(3); // join i2c bus with dev address 0x03
Wire.onReceive(receiveEvent); // register event
Wire.onRequest(requestEvent); // register event
memset (i2cReply, 0, sizeof(i2cReply)); // reset array
}
//***********************************************************************************************
//***********************************************************************************************
inline byte SetByteBit(byte source, byte bitval, byte bitnr) {
source &= ~( 1 << bitnr) ; // clear single bitval at pos bitnr
source |= bitval << bitnr; // set bitval to 0 or 1
return source;
}
//***********************************************************************************************
inline byte GetByteBit(byte source, byte bitnr) {
return (source & (1 << bitnr) ) != 0; // read bitval at pos bitnr
}
//***********************************************************************************************
byte digpinMode(byte pinnr) { // returns pinmode setting: OUTPUT (1) or INPUT (0) ?
if(pinnr<8)
return ((DDRD & (1<<pinnr))!=0);
else if(pinnr<14) // for Arduino Uno: 14 digital pins 0..13
return ((DDRB & (1<<(pinnr-8)))!=0);
}
//***********************************************************************************************
//***********************************************************************************************
void receiveEvent(int byteCount){
char i=0, j=0;
int chksum=0;
while(Wire.available()) {
i2cInput[i] = Wire.read();
chksum+=i2cInput[i]; // später optimieren!
i++; // number of bytes read
}
// parse input string:
// Input[0]+[1]: custom bytes; [2]...[13]: pins+pwms
for (j=2; j<14; ++j) {
if( (i2cInput[j]!=0)&&(i2cInput[j]!=NOPIN) ) analogWrite(i2cInput[j],i2cInput[j+1]);
j++;
}
}
//***********************************************************************************************
void requestEvent() {
Wire.write(i2cReply, sizeof(i2cReply)); // respond with message (sizeof) bytes
}
//***********************************************************************************************
//***********************************************************************************************
void writedigToi2creply(byte digpin, byte byteval){
byte bitbyte;
if((digpin>=0)&&(digpin<8)) {
bitbyte=SetByteBit(bitbyte, byteval, digpin);
i2cReply[12]=bitbyte;
}
else
if((digpin>=8)&&(digpin<16)) {
bitbyte=SetByteBit(bitbyte, byteval, digpin-8);
i2cReply[13]=bitbyte;
}
}
//***********************************************************************************************
void writeanaToi2creply(byte anapin, int intval) {
byte slot;
slot=(anapin+1)*2;
i2cReply[slot] =highByte(intval);
i2cReply[slot+1]=lowByte(intval);
}
//***********************************************************************************************
//***********************************************************************************************
void loop()
{
int intval;
byte byteval, pin;
memset (i2cReply, 0, sizeof(i2cReply));
pin=touchpin; // poll + send digital pins - probably even in a for-loop
if(digpinMode(pin)==INPUT) {
byteval=digitalRead(pin); // read digital: touchpin value
writedigToi2creply(pin, byteval); // read input value and write to i2creply array
}
digitalWrite(led13,byteval); // monitor digi 4 ==>> led13
pin=0; // poll + send analog pins
intval=analogRead(pin); // read analog: value 0
writeanaToi2creply(pin, intval); // write to i2creply array
delay(20);
}
ich habe versucht, die Arduino-pin-Werte auf dem serial Monitor auszugeben, erhielt aber nur völlig wirre Zeichenfolgen, sowohl auf dem Monitor als auch beim NXT-Master.
Kaum habe ich das serial rausgelöscht, lief alles perfekt.
ps
die Version inkl serial Monitor existiert leider nicht mehr, ich dachte nur, vllt ist das Problem schon irgendwem bekannt.
habe die codes und Einstellungen wiedergefunden:
nach dem Abschalten des serial Monitors hat es wie gesagt einwandfrei funktioniert.
Das forums-Mitglied, das auf meine Frage geantwortet hat, hatte die Idee, dass es mit serial + i2c zusammenhängen könnte!