работа Arduino pro mini 5v от 3.3v
- Войдите на сайт для отправки комментариев
Пнд, 26/10/2015 - 08:39
К распберри через spi и i2c подключена про мини
Чтобы не городить конвертер уровней поключил напрямую и запитал ардуину от отдельного dc-dc на 3.3вольта, т.к. с 3.3в распи можно взять 30 или 50мА.
Написал тестовый скетч, который должен послать результат analogRead`а по i2c про запросу.
Код:
#include <Wire.h> #define TWI_FREQ 100000L #define SLAVE_ADDRESS 0x77 #define BUZZER_PIN 3 #define BATTERY_VLTG_DIVIDER_PIN A7 int number = 0; int result = 0; int state = 0; double temp; int vltg; int len=1; int maxlen = 2; void setup() { pinMode(13, OUTPUT); pinMode(BATTERY_VLTG_DIVIDER_PIN, INPUT); // initialize i2c as slave Wire.begin(SLAVE_ADDRESS); // define callbacks for i2c communication Wire.onReceive(receiveData); Wire.onRequest(sendData); } void loop() { delay(10); temp = GetTemp(); // vltg = random(200,900); vltg = analogRead(BATTERY_VLTG_DIVIDER_PIN); // vltg = GetVltg(); } // callback for received data void receiveData(int byteCount){ result = 0; len = 1; while(Wire.available()) { number = Wire.read(); if (number == 13){ if (state == 0){ digitalWrite(13, HIGH); // set the LED on state = 1; result = 0x12; } else{ digitalWrite(13, LOW); // set the LED off state = 0; result = 0x14; } len = 1; } if(number==88) { result = (int)temp; len = 1; } if(number==0x01){ // result = vltg; result = (int)vltg; // result = 0x8814; len=2; // ; } } } // callback for sending data void sendData(){ uint8_t buff[len]; if (len == 1){ buff[0] = result; } if (len == 2){ buff[0] = lowByte(result); buff[1] = highByte(result); } Wire.write(buff, len); } // Get the internal temperature of the arduino double GetTemp(void) { unsigned int wADC; double t; ADMUX = (_BV(REFS1) | _BV(REFS0) | _BV(MUX3)); ADCSRA |= _BV(ADEN); // enable the ADC delay(20); // wait for voltages to become stable. ADCSRA |= _BV(ADSC); // Start the ADC while (bit_is_set(ADCSRA,ADSC)); wADC = ADCW; t = (wADC - 324.31 ) / 1.22; return (t); // return random(0, 10); } // int GetVltg(void) // { // //double readed;// = analogRead(BATTERY_VLTG_DIVIDER_PIN); // int readed = analogRead(BATTERY_VLTG_DIVIDER_PIN); // //magic // // int readed = 987; // // double tmp = 3.3*readed/1023; // // int vltg_calculated = tmp*100; // int vltg_calculated = readed; // //magic // return vltg_calculated; // }
Если в loop'е vltg сделать случайным, а не считывать с ноги ардуины, то все работает нормально, а если считывать - то скрипт на питоне, читающий из i2c вылетает с ошибкой IOError: [Errno 5] Input/output error
Фьюзы на ардуине не перешивал
Вопрос - чтобы "взлетело" что сделать? все мозги уже сломал
нашел в чем дело - GetTemp, дездумно скопипасченная из туториала про работе с i2c, что-то меняла в настройках АЦП ардуины