Что было не то со схемой
Mar. 28th, 2021 02:45 amПо следам https://wunderwaffe.dreamwidth.org/10675.html
Итак, с нерабочей схемой выяснить ничего не удалось, но удалось случайно ее починить -
Псоле демонтажа всего лишнего получилась такая схема -

Из А5 выходит SDA, который двумя транзисторами переключается на лиловый либо зеленый провод. Они ни к чему не подключены, меряется только напряжение лилового провода.
На выходах 4 и 5 выведено +5 вольт, т.е. оба транзистора открыты. SDA по умолчанию имеет уровень тоже +5 вольт.
Вопрос - каков будет потенциал лилового провода, если послать запрос на I2C
и при этом
1) кнопка на желтом проводе нажата
2) кнопка на желтом проводе отжата
Казалось бы, а не пофиг ли? Все равно шина не подключена, поэтому ничего не будет в обоих случаях, только ошибка подключения.
Нет - когда кнопка нажата, то потенциал падает до 0 вольт и более отжатием не подымается и ардуина виснет. (То же справедливо и для подключенных к шине магнитометров)
Проблема решилась так - лиловый провод, тупо 3 см, ведущих к разьему, просто выпаял и впаял обратно. Какой-то непропай транзистора? Да я его выпаивал и ставил другой 8( Или провод коротил с соседней землей в разьеме? Но прозвон ничего не дал. Хотя прозвон может ничего не дать, но остаток флюса.. Резисторы подтяжки для SDA и SCL пробовал самые разные.
Ниспослание испытаний для смирения и молитвы?
Проверочный код -
#include <Wire.h> //I2C Arduino Library
#include "math.h"
#define HMC5883L_ADDR 0x1E //0011110b, I2C 7bit address of HMC5883
bool doit = false;
bool detectHMC5883L() {
Serial.println('1');
Wire.beginTransmission(HMC5883L_ADDR); //open communication with HMC5883
Wire.write(10); //select Identification register A
Wire.endTransmission();
Wire.requestFrom(HMC5883L_ADDR, 3);
Serial.println('2');
if(Wire.available()==3) {
char a=Wire.read();
char b=Wire.read();
char c=Wire.read();
Serial.println('3');
if(a=='H'&&b=='3'&&c=='3') return true;
}
Serial.println('4');
return false;
}
void setup() {
pinMode(4, OUTPUT); //база1
pinMode(5, OUTPUT); //база2
digitalWrite(4,LOW);
digitalWrite(5,LOW);
Serial.begin(38400);
Wire.begin();
TWBR = 78; // 25 kHz
TWSR |= _BV (TWPS0
); // change prescaler
delay(100);
}
void loop() {
if (Serial.available()) {
byte bbb=Serial.read();
digitalWrite(4,HIGH);
digitalWrite(5,HIGH);
delay(10);
bool detect=detectHMC5883L();
if (detect==true) {Serial.println("OK");}
else {Serial.println("No HMC5883L detected!");}
delay(2000);
}
}
УПД: Выкинул к хуям. Новая вроде пашет.
Итак, с нерабочей схемой выяснить ничего не удалось, но удалось случайно ее починить -
Псоле демонтажа всего лишнего получилась такая схема -

Из А5 выходит SDA, который двумя транзисторами переключается на лиловый либо зеленый провод. Они ни к чему не подключены, меряется только напряжение лилового провода.
На выходах 4 и 5 выведено +5 вольт, т.е. оба транзистора открыты. SDA по умолчанию имеет уровень тоже +5 вольт.
Вопрос - каков будет потенциал лилового провода, если послать запрос на I2C
Wire.beginTransmission(HMC5883L_ADDR); //open communication with HMC5883 Wire.write(10); //select Identification register A Wire.endTransmission(); Wire.requestFrom(HMC5883L_ADDR, 3);
и при этом
1) кнопка на желтом проводе нажата
2) кнопка на желтом проводе отжата
Казалось бы, а не пофиг ли? Все равно шина не подключена, поэтому ничего не будет в обоих случаях, только ошибка подключения.
Нет - когда кнопка нажата, то потенциал падает до 0 вольт и более отжатием не подымается и ардуина виснет. (То же справедливо и для подключенных к шине магнитометров)
Проблема решилась так - лиловый провод, тупо 3 см, ведущих к разьему, просто выпаял и впаял обратно. Какой-то непропай транзистора? Да я его выпаивал и ставил другой 8( Или провод коротил с соседней землей в разьеме? Но прозвон ничего не дал. Хотя прозвон может ничего не дать, но остаток флюса.. Резисторы подтяжки для SDA и SCL пробовал самые разные.
Ниспослание испытаний для смирения и молитвы?
Проверочный код -
#include <Wire.h> //I2C Arduino Library
#include "math.h"
#define HMC5883L_ADDR 0x1E //0011110b, I2C 7bit address of HMC5883
bool doit = false;
bool detectHMC5883L() {
Serial.println('1');
Wire.beginTransmission(HMC5883L_ADDR); //open communication with HMC5883
Wire.write(10); //select Identification register A
Wire.endTransmission();
Wire.requestFrom(HMC5883L_ADDR, 3);
Serial.println('2');
if(Wire.available()==3) {
char a=Wire.read();
char b=Wire.read();
char c=Wire.read();
Serial.println('3');
if(a=='H'&&b=='3'&&c=='3') return true;
}
Serial.println('4');
return false;
}
void setup() {
pinMode(4, OUTPUT); //база1
pinMode(5, OUTPUT); //база2
digitalWrite(4,LOW);
digitalWrite(5,LOW);
Serial.begin(38400);
Wire.begin();
TWBR = 78; // 25 kHz
TWSR |= _BV (TWPS0
); // change prescaler
delay(100);
}
void loop() {
if (Serial.available()) {
byte bbb=Serial.read();
digitalWrite(4,HIGH);
digitalWrite(5,HIGH);
delay(10);
bool detect=detectHMC5883L();
if (detect==true) {Serial.println("OK");}
else {Serial.println("No HMC5883L detected!");}
delay(2000);
}
}
УПД: Выкинул к хуям. Новая вроде пашет.