9.0 TOTAL SCORE

Circuitmess Chatter

STEM

Chatter je neverovatan STEM komplet dizajniran za mlade majstore kao njihov prvi upad u svet elektronike. Postiže ovo i još mnogo toga u dobro dizajniranom i lepom pakovanju.


Kvalitet izrade 10
Implementirana tehnologija 7
Lakoća korišćenja 10
Odnos cena/performanse 9
PROS
  • Odlično uputstvo
  • Lako sastavljanje
  • Mnoštvo skrivenih mogućnosti za hakovanje
CONS
  • None

U prvoj polovini ove recenzije (pa, pokušali smo da je napravimo da bude polovina), bili smo fokusirani na prikaz početnog iskustva izgradnje CircuitMess-ovog Chatter kompleta. Taj članak možete pročitati ovde.
U ovoj drugoj polovini, želimo da istražimo malo dublje ispod same haube i da saznamo šta pokreće male Chatter uređaje – i da otkrijemo koliko možemo da izvučemo iz njih.

Ove „uradi sam“ mašine za slanje tekstualnih poruka koje se oslanjaju na LoRa protokolu dolaze opremljene USB-C konektorima za komunikaciju sa računarom i napravljene su da se programiraju pomoću CircuitMess-ovog sopstvenog CircuitBlocks IDE-a. IDE je zasnovan na Blockly jeziku – što znači da je jednostavan za upotrebu i prilično intuitivan za novopridošlice u ovoj oblasti.
Jednom preuzet, CircuitBlocks „grabi“ skup obimnih i dobro napisanih biblioteka koje omogućavaju pristup na visokom nivou svim glavnim hardverskim komponentama Chatter-a – posebno fokusirajući se na tastere, piezo zujalicu i ekran. Kada ovde kažemo na visokom nivou, to zaista mislimo. Tim je uradio sjajan posao sa osnovnom bibliotekom koja se nalazi pod nazivom CircuitOS. Ona objedinjuje iskustvo iz dosadašnjih kit-kompleta kompanije i pruža jednostavne pozive za rukovanje pritisaka na tastere, grafikim sprite-ovima, interaktivnim elementima korisničkog interfejsa, zvukom i multitaskingom. Sve to čini da programiranje Chatter-a što manje izgleda na programiranje MCU-a, a više kao pravo desktop iskustvo slično onome koje su učenici možda već prethodno imali.

Važno je napomenuti da su ovo Arduino biblioteke (više o tome kasnije) – i da CircuitBlocks nudi i programiranje zasnovano na blokovima, ali i editor koda. U blok režimu, editor koda se nalazi u režimu koji omogućava samo čitanje i prikazuje kodom interpretirane blokove u realnom vremenu – fino rešenje! Igrajući se sa ugrađenim demoima, počeli smo da cenimo kolike dubine ovi kompleti mogu da ponude. Bilo je neverovatno videti koliko je sjajnog „sintaksičkog šećera“ prisutno – a posebno tu mislimo na implementaciju multitaskinga. Svesni smo da to iznova pominjemo – ali način na koji je to ovde urađeno mnogo liči na pristup hendlera događaja u Javi ili C# – što je jednostavno fenomenalno!

Koristeći Blockly interfejs sastavili smo nekoliko malih demonstracija, pre nego što smo napravili još neke u prikazu editora koda. Sve ovo nam je pomoglo da saznamo što više o softverskoj arhitekturi koja stoji iza njih.

#include <Arduino.h>
#include <CircuitOS.h>
#include <Chatter.h>
#include <Loop/LoopManager.h>

int i;
int z;

Display* display;
Sprite* sprite;

void BTN_1_press(){
  sprite->clear(TFT_ORANGE);
  z = 1;
  Print_from_left(50, 1);

}

void BTN_2_press(){
  sprite->clear(TFT_NAVY);
  z = 2;
  From_right(1, 1);

}

int Print_from_left(int q, int w) {
  int i_inc = 1;
  if (-60 > q) {
    i_inc = -i_inc;
  }
  for (i = -60;
       i_inc >= 0 ? i <= q : i >= q;
       i += i_inc) {
    sprite->clear(TFT_ORANGE);
    Print(i, w);
    Piezo.tone((i * 10 + 1000), 0.0001);
    delayMicroseconds(100);
  }
  Piezo.noTone();
}

int Print(int a, int b) {
  sprite->setTextColor(TFT_BLACK);
  sprite->drawString((String(z)), (a + 3), (b + 3));
  sprite->setTextColor(TFT_DARKGREY);
  sprite->drawString((String(z)), (a + 2), (b + 2));
  sprite->setTextColor(TFT_LIGHTGREY);
  sprite->drawString((String(z)), (a + 1), (b + 1));
  sprite->setTextColor(TFT_WHITE);
  sprite->drawString((String(z)), (a), (b));
  display->commit();
}

int From_right(int q, int w) {
  for (i = 180; i >= 0; i--) {
    sprite->clear(TFT_DARKCYAN);
    Print(i, 1);
    Piezo.tone((i * 10 + 1000), 0.0001);
    delayMicroseconds(100);
  }
  Piezo.noTone();
}

void setup() {
 Serial.begin(115200);
  Serial.println();
  Chatter.begin();
  display = Chatter.getDisplay();
  sprite = display->getBaseSprite();
  Input::getInstance()->setBtnPressCallback(BTN_1, BTN_1_press);
  Input::getInstance()->setBtnPressCallback(BTN_2, BTN_2_press);

  z = 1;
  sprite->clear(TFT_ORANGE);
  sprite->setTextSize(9);
  sprite->setTextFont(2);

}

void loop() {
  LoopManager::loop();
  Input::getInstance()->loop(0);

}

Ipak, želeli smo više! Kopajući nakon toga, zaključili smo da je Chatter zasnovan na popularnoj arhitekturi ESP32 – time što koristi veoma voljeni ESP-VROOM modul (sa ESP32-D0VDK6 – malo starijim čipom, ali i dalje prilišno moćnim). Mnogobrojni tasteri povezani su preko mux čipa – dok je ostatak GPIO uglavnom posvećen ekranu i CP340 USB konvertoru. Šteta što su dizajneri koristili CP340 umesto CP2012 ovde (što nam je zadalo ozbiljne glavobolje sa pouzdanošću na macOS Monterey-u – ali je sve dobro funkcionisalo na Windows 11 platformi). Pokretanje Arduino IDE-a dalo nam je još neke naznake o tome kako funkcioniše softverski ekosistem CircuitMess-a – pošto su sve datoteke biblioteke uredno raspoređene u sopstvenu Arduino IDE fasciklu – i predstavljaju (naizgled) fork Espressif-ove arduino-esp32 biblioteke – što znači da se programiranje vrši pomoću nemodifikovanog esptool-a ispod haube.

Ali čekajte, mogli biste reći, ESP32? To znači…
Yep! Osim LoRa-a, koji je glavni radio koji se koristi u ovom projektu, Chatter ima ugrađene i WiFi i Bluetooth mogućnosti – zahvaljujući uspravo ESP32-WROOM SoC-u, mada pokušava da se drsko pretvara da ih nema. Šalu na stranu – to je sjajna karakteristika (ali ozbiljno, Google-ujte „CircuitMess Chatter WiFi“ i uživajte u slavi nultog pominjanja ovoga). Što onda znači…
Yep! Standardne ESP32 biblioteke rade sasvim dobro sa Chatter-om – i stoga smo odlučili da sastavimo mali demo koji koristi WiFi antenu da pronađe dostupne WiFi mreže i odštampa ih na ekranu – i to je odlično funkcionisalo! Ovo otkriće je zaista bilo mali dragulj – i izuzetno smo zadovoljni činjenicom da je Chatter više nego što se čini na prvi pogled (internet slanje poruka praktično traži da se sada realizuje).

#include "WiFi.h"

#include <CircuitOS.h>
#include <Chatter.h>

Display* display;
Sprite* sprite;

void setup() {
  Serial.begin(115200);


  Chatter.begin();
  display = Chatter.getDisplay();
  sprite = display->getBaseSprite();

  sprite->setTextSize(1);
  sprite->setTextFont(1);
  sprite->setTextColor(TFT_WHITE);
  sprite->clear(TFT_BLACK);
  display->commit();

  WiFi.mode(WIFI_STA);
  WiFi.disconnect();
  delay(100);

  Serial.println("WiFi On");
}

void loop() {
  Serial.println("Pretraga...");

  // WiFi.scanNetworks will return the number of networks found
  int n = WiFi.scanNetworks();
 
  if (n == 0) {
    Serial.println("No networks");
  } else {
    Serial.print(n);
    Serial.println(" networks available");
  }
    int yaxis = 10;
    for (int i = 0; i < n; ++i) {
      

      sprite->drawString(WiFi.SSID(i), 10, yaxis);
      display->commit();
      yaxis = yaxis + 10;
      Serial.print(i + 1);
      Serial.print(": ");
      Serial.print(WiFi.SSID(i));
      Serial.print(" (");
      Serial.print(WiFi.RSSI(i));
      Serial.print(")");
      Serial.println((WiFi.encryptionType(i) == WIFI_AUTH_OPEN)?" ":"*");
      delay(10);
    }
  
  Serial.println("");
  delay(5000);
  sprite->clear(TFT_BLACK);
}

Sve u svemu, Chatter je više nego što se čini na prvi pogled. Bogat skup biblioteka nudi odličnu polaznu tačku za početnike, dok sama priroda ESP32 platforme pruža veliki potencijal uređaja za one koji su voljni da kopaju malo dublje. Za svoju cenu – set od dva potpuno programabilna razvojna kompleta, od kojih svaki ima LoRa, WiFi i Bluetooth, ovo je ozbiljno dobar posao. Iskreno, impresionirani smo. Bravo.

Više informacija: CircuitMess https://circuitmess.com/pages/chatter


Side-note o macOS Monterey
Dok je na Windows-u sve funkcionisalo savršeno (i ne mogu ovo dovoljno naglasiti – sve je funkcionisalo apsolutno savršeno, na više mašina koje smo isprobali), naišli smo na neke probleme sa macOS-om. Prvo, imali smo problema sa samim bibliotekama čipova – koje su odbile da lociraju instalaciju pyton-a zbog uklanjanja u novijim verzijama macOS-a. Ovo je već popravljeno u glavnom repo esp32, ali i ručna popravka je prilično laka:

sudo sed -i -e 's/=python /=python3 /g' ~/Library/Arduino15/packages/cm/hardware/esp32/*/ platform.txt

Iako je ovo ispravilo greške pri kompilaciji u Arduino IDE – CircuitBlocks i dalje nije bio zadovoljan i nije uspevao da se kompajlira, čak i nakon pokretanja direktno sa terminala (ponekad, macOS aplikacije ne mogu pravilno da pročitaju putanju kada se pokrenu sa Launchpad-a).

Drugo, problemi sa otpremanjem. Čudno je da dugme BOOT – standardno na skoro svim ESP32 pločama – nije postavljeno, s obzirom na temperamentnu prirodu starijeg Espressif silikona. Vidite, da bi ploča prihvatila nove programske podatke, GPIO 0 mora biti postavljen na „low“. Ovo bi obično trebalo da uradi tranzistor koga kontroliše softver, ali ponekad tajming može da krene malo po zlu i uređaj jednostavno ne uspe da uđe u režim pokretanja (iz čega proizilazi zloglasni problem „invalid head of packet“). Ovde se pomalo nepouzdana priroda CP340 uparila sa silikonskim problemima starije revizije ESP32 – pa je više od polovine svih pokušaja programiranja na našem Mac-u spektakularno propalo.

Sada, da bismo došli do ove tačke, morali smo i da radimo malo. Verzija esptool-a koja se isporučuje sa bibliotekom CircuitMess je 3.0.0 – dok je 3.3.0 najnovija u vreme pisanja (još jedan sistem zasnovan na ESP32 koji redovno koristimo radi sasvim dobro sa novijim alatom). Starija verzija je imala neke izveštaje u vezi sa samim tajming problemom sa kojim smo se suočili. Ispravka koju smo morali da primenimo je dodatno čekanje u kodu dok se čip sam ne dozove.

Ostala moguća rešenja ovde uključuju elektrolitički kondenzator između GPIO 0 i GND ili prosleđivanje „– -after esp32r0“ argumenta komandi esptool, ako koristite Arduino CLI. Ili samo pritiskom na dugme BOOT – koje se ovde nigde ne može naći.

Ili je možda sve ovo bio samo macOS koji je radio ono što najbolje radi tokom velikih ažuriranja neke verzije – zabrljao je neki .kekt duboko ispod haube.

Nadamo se da je ovo nešto što se uskoro može popraviti. To ne umanjuje iskustvo ili radost koju nam je ovaj komplet doneo – ali maloj grupi korisnika Mac-a na određenim verzijama OS-a, iskustvo kodiranja može biti malo manje od idealnog.