Skocz do zawartości

Arduino Nano 33 IoT i expandery (sparkfun SX1509, PCF8575), problem z działaniem i stabilnością


ojezu

Pomocna odpowiedź

(wrócił mi pracowity zapał w związku z tym, że dowiedziałem się o Home Assistant).

Bardzo spodobał mi się Nano 33 IoT, wszystko w jednym jak dla mnie wydaje mi się, mnóstwo pamięci i do tego dość tanio (w porównaniu np do Arduino UNO WiFi rev2).

Robię takie różne PoC (Proof of Concept); dimmer 230V, zdalne raportowanie temperatury, w planach czujniki zwarcia i sterowanie przyciskami, jasność diód LED.
Więc poza zaprogramowaniem indywidualnej logiki na koniec potrzebne jest mi powielenie tego na bardzo wiele kopii, potrzebuję 15 obwodów dimmera 230V i 19 binarnych IO, i spodobało by mi się zrobienie każdej z tych funkcji na jednym Arduino, a nie powielanie tego w małych grupkach.
A jeszcze mnie czeka 19 PWMów.

Teoretycznie do tego podchodząc do dimmera i binarnego IO powinien mi pomóc expander portów, kupiłem najpierw sparkfun SX1509, miałem pewne problemy, przykłady działały, ale jak próbowałem dołączyć expander do działającego pełnego "inteligentnego sterownika" (MQTT, WiFi) to nie dość że nie działało, to jeszcze miałem mnóstwo dziwnych problemów, Windows nie wykrywał urządzenia USB, mnóstwo problemów z ładowaniem skompilowanego skryptu, było łączenie z WiFi i z brokerem MQTT ale potem nic więcej.

Więc kupiłem inny expander, PCF8575, no i niestety powtórka z rozrywki, miałem takie problemy z nim, że myślałem że zbrikowałem Nano (dwa szybkie resety rozwiązują sprawę).

 

A więc pytanie, czy te problemy mogą być spowodowane za słabym ogólnie zasilaniem? Wydajnością 3,3V z Nano?
Czy możliwe jest, że Nano zostaje przeciążone tym dodatkowym układem?

Jeśli tak to jak zasilanie można usprawnić? A ogólnie jak mając zasilanie 12V uzyskać jakieś moce na 5 i 3,3V?, najlepiej za jednym zamachem.

Połączenia były standardowe, SDA, SCL, GND, 3v3.

Jak tak napisałem pomyślałem że z PCF8575 mogę zewrzeć 5V z USB do płytki jako VCC, ale czy to ma sens (zasilanie 5V a I2C sygnalizacja 3V3)?
Ale hipotetycznie w tej sytuacji płytka nie byłaby zasilana bezpośrednio przez Nano - dziś spróbuję.
Ale to nie rozwiązuje mojego problemu bo docelowo chciałbym to zasilać 12V only, nie przez micro USB.

 

A jeśli nie zasilanie to może jakieś pomysły co można zrobić inaczej.

Link do komentarza
Share on other sites

Jeśli zasilałeś te ekspandery z 5V i używałeś gotowych modułów, które mają już rezystory podciągające, to źródło problemów jest oczywiste — dajesz 5V na nóżki biednego Nano, które tolerują co najwyżej 3.3V. Moim zdaniem możesz je spokojnie wyrzucić teraz do kosza, bo trudno wywróżyć co się spaliło.

Żeby uzyskać 5 albo 3.3 z 12V z małymi stratami chcesz użyć przetwornicy — buck converter. Modelarze nazywają to UBEC.

Link do komentarza
Share on other sites

16 minut temu, deshipu napisał:

Jeśli zasilałeś te ekspandery z 5V

nie dawałem na nie 5V, skąd to przypuszczenie?

Cytat

dajesz 5V na nóżki biednego Nano

nie rozumiem logiki, jakie 5V na Nano?,
przecież to Nano 3,3V zasila expander (biorąc 5V z USB, albo 12 V z DC INi konweertując to na swoje zasilanie 3,3V),
a nie expander daje 5V z porwrotem do Nano (na 3.3V?).

5V jeszcze się w tych próbach z expanderm nie pojawiło;
teraz tylko się zastanawiam że jeżeli istnieje konflikt między wydajnością prądową pinu 3V3 z Nano a zapotrzebowaniem chipa extendera, to mogę spróbować to ominąć przez wzięcie zasilania do extendera przez zworę z USB 5V.

Na razie oba ekspandery nie chcą działać na 3,3V i o tym chcę rozmawiać żeby znaleźć rozwiązanie problemu.

 

OK, "buck converter". Poszukam. Dzięki.

Link do komentarza
Share on other sites

Trudno zrozumieć co tak naprawdę zrobiłeś z twojego opisu. Może pokaż schemat i zdjęcie układu.

Ekspandery same z siebie nie biorą jakichś wielkich prądów — oczywiście zależy co do nich jeszcze podłączysz.

Link do komentarza
Share on other sites

Zarejestruj się lub zaloguj, aby ukryć tę reklamę.
Zarejestruj się lub zaloguj, aby ukryć tę reklamę.

jlcpcb.jpg

jlcpcb.jpg

Produkcja i montaż PCB - wybierz sprawdzone PCBWay!
   • Darmowe płytki dla studentów i projektów non-profit
   • Tylko 5$ za 10 prototypów PCB w 24 godziny
   • Usługa projektowania PCB na zlecenie
   • Montaż PCB od 30$ + bezpłatna dostawa i szablony
   • Darmowe narzędzie do podglądu plików Gerber
Zobacz również » Film z fabryki PCBWay

detale;

Mam sobie 8 kanałowy dimmer, czekający od lat na uruchomienie, (nie wiem gdzie się rysuje te prześliczne obrazki z Arduino) zdjęcie z natury:

20210528_225532.thumb.jpg.86ceddd4c478ca3de785955ebd768569.jpg

Z Arduno mam połączone

VCC do 3.3V
GND do GND
SYNC który się wyzwala gdy 230V przechodzi przez 0 do PIN 3 Arduino
Channel1 do pinu cyfrowego, Nano D4, SX1509 PIN 0

Z Nano żeby było wygodniej stosuję "rozgałęziacz - adapter"

20210528_225556.thumb.jpg.737c266da886cb3b8fbceac8b1d976b5.jpg

Z Nano samym wszystko co do tej pory zrobiłem działa, taki to jest na razie Proof of Concept
ale zabraknie mi pinów na dwa takie dimmery,
więc pomyślałem o expanderze IO, kupiłem sparkfun SX1509,

ale próbowałem też PCF8575 z podobnymi rezultatami czyli identycznymi problemami.

 

20210528_225617.thumb.jpg.174e3eacc3b8cb842521b3bc39482a0d.jpg

SCL do SCL
SDA do SDA
3V3 do 3V3
GND do GND
PIN0 do Channel1 na dimmerze.

Jak skanuję I2C expander się zgłasza,

Jak załaduję swój skrypt na pełną konfigurację to program trochę działa, mało co robi, a po chwili się zawiesza
a w dodatku Windows przestaje wykrywać Nano: USB device not recognized.

Tak jak pisałem na początku sam z siebie podejrzewałem wydajność prądową PINu Nano i sprawdziłem to.

Dimmer pobiera na oko 4,7 mA, expander mniej niż 1 mA, więc nie potwierdziło się podejrzenie prądowe, tam chyba wydaje mi się powinno być dostępne z 70mA.

Jak już miałem wszystko połączone zacząłem rozłączać różne rzeczy i patrzeć co się dzieje i odkryłem że jak odłączę SYNC podłączony z PINem 3 i przerwaniem to wszelkie problemy z zawieszaniem się i wykrywaniem przez windowsy ustępują (włącznie z funkcjonalnością dimowania).

Więc wyszło, że coś jest nie tak z przerwaniami, mój program używa dwa różne przerwania, wydaje mi się, hardwarowy na pinie 3 i softwarowy/wewnętrzny(?) timer.

I to hardwarowe przerwanie, wydaje mi się na teraz, gryzie się z wire.h (który podobno tez wykorzystuje przerwania, nie wiem jakie, i jest humorzasty na inne przerwania programu z tego co na razie wiem) do I2C, a gryzą się tak, że aż komunikacja po USB wysiada -wisi terminal i nie ma wykrywania w windowsach.

Walczę dalej chociaż naprawdę przerwania to już dla mnie hardcore.

Kod programu:

 

//Arduino SAMD (32 bits ARM Cortex M0+) Boards v1.8.11, Board Arduino NANO 33 IoT

// These define's must be placed at the beginning before #include "SAMDTimerInterrupt.h"
#define TIMER_INTERRUPT_DEBUG         0
#define _TIMERINTERRUPT_LOGLEVEL_     0

#include "SAMDTimerInterrupt.h" //v1.3.0
#include "SAMD_ISR_Timer.h"

// Depending on the board, you can select SAMD21 Hardware Timer from TC3-TCC
// SAMD21 Hardware Timer from TC3 or TCC
// Init SAMD timer TIMER_TC3
SAMDTimer ITimer(TIMER_TC3);

#include <Wire.h> // Include the I2C library (required)
#include <SparkFunSX1509.h> // Include SX1509 library  v2.0.1, one wire 2.3.5? czy MySensors v2.3.2

// SX1509 I2C address (set by ADDR1 and ADDR0 (00 by default):
const byte SX1509_ADDRESS = 0x3E;  // SX1509 I2C address
SX1509 io; // Create an SX1509 object to be used throughout

const int channel_1 = 7;  // SX1509 pin 0, Output to Opto Triac pin, channel 1

int CH1, maxCH1;
#define STEP             20 //stopni jasności
int clock_tick; // variable for Timer
String readString;

void setup() {

int maxCH1 = 17;

attachInterrupt(digitalPinToInterrupt(3), zero_crosss_int, RISING);
  
  Serial.begin(9600);
  while (!Serial);
  delay(100);

  Serial.print(F("\nStarting TimerInterruptLEDDemo on ")); Serial.println(BOARD_NAME);
  Serial.println(SAMD_TIMER_INTERRUPT_VERSION);
  Serial.print(F("CPU Frequency = ")); Serial.print(F_CPU / 1000000); Serial.println(F(" MHz"));

  Serial.println("Testing connection to SX1509 extender.");
  if (!io.begin(SX1509_ADDRESS))
  {
    while (1) ; // If we fail to communicate, loop forever.
  }

  Serial.println("SX1509 extender connected.");

  io.pinMode(channel_1, OUTPUT);// Set AC Load pin as output


  Serial.println("END OF SETUP ");
  
}

void timerIsr()
{

if (CH1 == clock_tick or ( clock_tick == maxCH1 and CH1 >= maxCH1 and CH1 != STEP+5 )  ) 
  io.digitalWrite(channel_1, HIGH); // triac firing  }

delayMicroseconds(30); // triac On propogation delay (for 60Hz use 8.33)

if (CH1 > 0) { io.digitalWrite(channel_1, LOW); }// triac Off, if posrednia moc

clock_tick++;

}



void zero_crosss_int() // function to be fired at the zero crossing to dim the light
{
  // Every zerocrossing interrupt: For 50Hz (1/2 Cycle) => 10ms ; For 60Hz (1/2 Cycle) => 8.33ms
  // 10ms=10000us , 8.33ms=8330us
  
  ITimer.attachInterruptInterval(10000/STEP, timerIsr);
 
  clock_tick = 0;
}


void loop() {

  Serial.println("MAIN LOOP ");
 
  Serial.print("INPUT integer 0-"); Serial.print(STEP);  Serial.print(", = ");  

  while( !Serial.available() ) {}

  while (Serial.available()) {
    char c = Serial.read();  //gets one byte from serial buffer
    readString += c; //makes the String readString
    delay(2);  //slow looping to allow buffer to fill with next character
  }

  if (readString.length() >0) {
    Serial.println(readString);  //so you can see the captured String 
    CH1 = readString.toInt();  //convert readString into a number
    Serial.print( "CH1 set to ");Serial.println(CH1); //so you can see the integer
    readString="";
  } 


}

 

 

 

 

Link do komentarza
Share on other sites

Bądź aktywny - zaloguj się lub utwórz konto!

Tylko zarejestrowani użytkownicy mogą komentować zawartość tej strony

Utwórz konto w ~20 sekund!

Zarejestruj nowe konto, to proste!

Zarejestruj się »

Zaloguj się

Posiadasz własne konto? Użyj go!

Zaloguj się »
×
×
  • Utwórz nowe...

Ważne informacje

Ta strona używa ciasteczek (cookies), dzięki którym może działać lepiej. Więcej na ten temat znajdziesz w Polityce Prywatności.