check in
Ongoing

Garek_V1

STDGarek_V1

tag

833
0
0
0
Mode:Full

License

Creation time:2020-04-13 15:03:06Update time:2020-09-28 15:02:58

Description

##ElektroGarek

jak żywy.jpg
####Lutowanie:
Informacje co i gdzie przylutować są dostępne w tabeli BOM*.
Przeszkolenie będzie jak się zbierzemy w Kapitolu lub na Discordzie.
Wizualizacja z której łatwo czerpać informacje co gdzie i w którą stronę przylutować jest dostępna niżej. Trzeba znaleźć schemat płytki, otworzyć go w edytorze używając dobrze widocznego przycisku, a następnie na gornym pasku znaleźć 3d view.

Tymczasem wrzucam obrazki ukradzione z przypadkowej aukcji na Aliexpress
Podstawowa instrukcja
Praktyczne zdjęcie
Przycisk, identyfikacja elementów

####Programowanie - wstęp
Mikrokontroler najłatwiej zaprogramować używając ArduinoIDE, dostępnego tutaj.
Po instalacji, trzeba wejść w File->Preferences->Additional Board manager URLs i dodać tam link

http://digistump.com/package_digistump_index.json

Następnie trzeba wejść w Tools->Board->Board manager, i tam wyszukać i zainstalować

Digistump AVR Boards by Digistump

Potem znowu w Tools->Board trzeba przescrollować w dół i wybrać

Digispark (Default - 16.5MHz)

a w Tools->Programmer wybrać

Micronucleus

Potem można wybrać przykładowy sketch z File->Examples->Examples for Digispark (Default - 16.5MHz) lub Built-in examples i kliknąć przycisk ze strzałką żeby skompilować i wgrać. W dolnej części ekranu IDE da znać kiedy należy odłączyć i ponownie podłączyć kabel USB, alternatywnie jeśli reset nie został wyłączony można użyć prawego przycisku żeby zresetować mikronontroler.

####Jeśli nie działa
Prawdopodobnie system ma problem ze sterownikami. Aby to naprawić najlepiej ściągnąć i zainstalować paczkę sterowników dostępną tutaj, bezpośredni link do pobrania: https://github.com/digistump/DigistumpArduino/releases/download/1.6.7/Digistump.Drivers.zip
#####Jeśli dalej nie działa
Wtedy trzeba po podłączeniu Garka pod USB wejść w Windowsie w Ten komputer->Właściwości->Menedżer urządzeń, tam znaleźć urządzenie. Jeśli wszystko działa poprawnie będzie widoczne w kategorii Atmel USB Devices jako Digispark Bootloader, jeśli nie prawdopodobnie pokaże się jako niezidentyfikowane urządzenie USB. W takim wypadku trzeba ręcznie wybrać sterownik Digispark.

####Programowanie - informacje różne
Chip ma wgrany bootloader Micronucleus, taki sam jak w fabrycznej płytce Digispark. Wszystkie materiały na temat programowania Digisparka mają zastosowanie tutaj, z zastrzeżeniem że większośc GPIO** ma na sztywno przypisane role:

  • PIN0: Sterowanie oczami WS2812;
  • PIN1: Wyciągnięty na zewnątrz, do zagospodarowania;
  • PIN2: Przycisk lewy;
  • PIN3: Przewód D- portu USB;
  • PIN4: Przewód D+ portu USB;
  • PIN5: Przycisk prawy, reset.

Digispark w ArduinoIDE ma sporo przykładowych programów, większość powinna działać.
Niestety biblioteka DigiCDC służąca do emulowania portu szeregowego odmawia współpracy z Windowsem 10.

####Kod podstawowy, miganie oczami na różne sposoby przełączane przyciskiem
Do działania potrzebna jest biblioteka Adafruit NeoPixel. Żeby ją zainstalować trzeba w ArduinoIDE wejść w Sketch->Include Library->Manage libraries, tam wyszukać NeoPixel i zainstalować najnowszą wersję. Trzeba zwrócić uwagę na wybranie właściwej biblioteki, na pierwszym miejscu może być inna tego samego producenta, która tutaj nie zadziała.

Kod składa się głównie z przerobionego przykładu Adafruit_NeoPixel->buttoncycler, przerobionego i poprawionego w celu umożliwienia zmiany koloru w dowolnym momencie. Żeby dodać własną animację trzeba dopisać nową funkcję, dodać ją do switcha w funkcji startShow oraz zwiększyć stałą ANIMATION_NUMBER.

Funkcje przy każdej zmianie kolorów wpisują do zmiennej frameTime aktualny czas w milisekundach, można używać tej zmiennej do kontrolowania szybkości animacji.
Analogicznie można użyć frameIndex jako indeksu klatki w bardziej skomplikowanych animacjach. animationIndex jest używany do wyboru animacji, obsługuje go funkcja getGlobalIndex. Zmienne switched, oldState, newState i changeTime są używane do obsługi przycisku, lepiej nie używać ich w animacjach.

W linii 6 po #include powinno być Adafruit_NeoPixel.h w nawiasach trójkątnych, ale ta strona to usuwa. Nie rozumiem.

// This is a demonstration on how to use an input device to trigger changes on your neo pixels.
// You should wire a momentary push button to connect from ground to a digital IO pin.  When you
// press the button it will change to a new pixel animation.  Note that you need to press the
// button once to start the first animation!

#include 

#define BUTTON_PIN   2    // Digital IO pin connected to the button.  This will be
// driven with a pull-up resistor so the switch should
// pull the pin to ground momentarily.  On a high -> low
// transition the button press logic will execute.

#define PIXEL_PIN    0    // Digital IO pin connected to the NeoPixels.

#define PIXEL_COUNT 2 // ilość LEDów, 2 oczy

#define ANIMATION_NUMBER 10 // ilość animacji, zwiększyć jeśli dodajesz animacje

#define MAX_UINT16 65536 // 2^16

uint8_t animationIndex = 1;//Numer aktualnej animacji
uint8_t frameIndex = 0;//Numer klatki, używane przez funkcje do zmiany kolor, globalny dla uniknięcia delay'ów
uint8_t switched = false;//Czy w danej iteracji naciśnięto przycisk
uint8_t oldState = LOW;//stary stan przycisku
uint8_t newState;//nowy stan przycisku
uint16_t changeTime = 0;//czas przejścia przycisku w stan wysoki
uint16_t frameTime = 0;//Czas ostatniej zmiany klatki, dla uniknięcia delay'ów


// Parameter 1 = number of pixels in strip,  neopixel stick has 8
// Parameter 2 = pin number (most are valid)
// Parameter 3 = pixel type flags, add together as needed:
//   NEO_RGB     Pixels are wired for RGB bitstream
//   NEO_GRB     Pixels are wired for GRB bitstream, correct for neopixel stick
//   NEO_KHZ400  400 KHz bitstream (e.g. FLORA pixels)
//   NEO_KHZ800  800 KHz bitstream (e.g. High Density LED strip), correct for neopixel stick
Adafruit_NeoPixel strip = Adafruit_NeoPixel(PIXEL_COUNT, PIXEL_PIN, NEO_GRB + NEO_KHZ800);

void setup() {
  pinMode(BUTTON_PIN, INPUT_PULLUP);
  strip.begin();
  strip.show(); // Initialize all pixels to 'off'
  changeTime = frameTime = millis();
}

uint8_t getGlobalIndex()
{
  const static uint8_t dbtime = 20;

  newState = digitalRead(BUTTON_PIN);

  if (oldState == HIGH && newState == LOW)//initial button press
  {
    changeTime = millis() % MAX_UINT16;
  }
  if (oldState == LOW && newState == LOW && (millis() - changeTime) % MAX_UINT16 >= dbtime && !switched ) //Button still pressed
  {
    animationIndex = (animationIndex + 1) % (ANIMATION_NUMBER + 1);
    switched = true;
  }
  if (newState == HIGH)
  {
    switched = false;
  }
  oldState = newState;
  return animationIndex;
}

void loop() {
  getGlobalIndex();
  startShow(animationIndex);
}

uint16_t lastFrame;
void startShow(int i) {
  switch (i) {
    case 0: colorWipe(strip.Color(0, 0, 0));    // Black/off
      break;
    case 1: colorWipe(strip.Color(255, 0, 0));  // Red
      break;
    case 2: colorWipe(strip.Color(0, 255, 0));  // Green
      break;
    case 3: colorWipe(strip.Color(0, 0, 255));  // Blue
      break;
    case 4: theaterChase(strip.Color(127, 127, 127), 50); // White
      break;
    case 5: theaterChase(strip.Color(127,   0,   0), 50); // Red
      break;
    case 6: theaterChase(strip.Color(  0,   0, 127), 50); // Blue
      break;
    case 7: rainbow(20);
      break;
    case 8: rainbowCycle(20);
      break;
    case 9: theaterChaseRainbow(50);
      break;
    case 10: police(250);
      break;
  }
}

// Fill the dots one after the other with a color
void colorWipe(uint32_t c) {
  strip.fill(c, 0, PIXEL_COUNT);
  strip.show();
}

void rainbow(uint8_t wait) {
  uint16_t thisTime = millis() % MAX_UINT16;
  if ((thisTime - frameTime) % MAX_UINT16 > wait)
  {
    frameTime = thisTime;
    frameIndex += 1;
    uint16_t i;
    for (i = 0; i < strip.numPixels(); i++)
    {
      strip.setPixelColor(i, Wheel((i + frameIndex) & 255));
    }
    strip.show();
  }

}

// Slightly different, this makes the rainbow equally distributed throughout
void rainbowCycle(uint8_t wait) {
  uint16_t thisTime = millis() % MAX_UINT16;
  if ((thisTime - frameTime) % MAX_UINT16 > wait)
  {
    frameTime = thisTime;
    frameIndex += 1;
    uint16_t i;
    for (i = 0; i < strip.numPixels(); i++)
    {
      strip.setPixelColor(i, Wheel(((i * 256 / strip.numPixels()) + frameIndex) & 255));
    }
    strip.show();
  }
}

//Theatre-style crawling lights.
void theaterChase(uint32_t c, uint8_t wait) {
  static uint8_t part = 0;
  static uint8_t q;

  if (part == 0)
  {
    for (int i = 0; i < strip.numPixels(); i = i + 3)
    {
      strip.setPixelColor(i + q, c);  //turn every third pixel on
    }
    strip.show();
    frameTime = millis() % MAX_UINT16;
    part = 1;
  }


  if (part == 1 && (millis() % MAX_UINT16 - frameTime) % MAX_UINT16 > wait)
  {
    for (int i = 0; i < strip.numPixels(); i = i + 3) {
      strip.setPixelColor(i + q, 0);      //turn every third pixel off
    }
    strip.show();
    part = 0;
    q = (q + 1) % 3;
  }
}


//Theatre-style crawling lights with rainbow effect
void theaterChaseRainbow(uint8_t wait)
{
  static uint8_t part = 0;
  static uint8_t q = 0;
  if (part == 0)
  {
    for (int i = 0; i < strip.numPixels(); i = i + 3) {
      strip.setPixelColor(i + q, Wheel( (i + frameIndex) % 255)); //turn every third pixel on
    }
    strip.show();
    frameTime = millis() % MAX_UINT16;
    part = 1;
  }

  if (part == 1 && (millis() % MAX_UINT16 - frameTime) % MAX_UINT16 > wait)
  {
    for (int i = 0; i < strip.numPixels(); i = i + 3)
    {
      strip.setPixelColor(i + q, 0);      //turn every third pixel off
    }
    strip.show();
    part = 0;
    q = (q + 1) % 3;
    frameIndex += 1;
  }
}

void police(uint16_t wait)
{
  static uint8_t part = 0;
  uint16_t thisTime = millis() % MAX_UINT16;
  if ((thisTime - frameTime) % MAX_UINT16 > wait)
  {
    strip.setPixelColor(0, strip.Color(255 * part, 0, 255 * (1 - part)));
    strip.setPixelColor(1, strip.Color(255 * (1 - part), 0, 255 * part));
    part = 1 - part;
    frameTime = thisTime;
    strip.show();
  }

}

// Input a value 0 to 255 to get a color value.
// The colours are a transition r - g - b - back to r.
uint32_t Wheel(byte WheelPos) {
  WheelPos = 255 - WheelPos;
  if (WheelPos < 85) {
    return strip.Color(255 - WheelPos * 3, 0, WheelPos * 3);
  } else if (WheelPos < 170) {
    WheelPos -= 85;
    return strip.Color(0, WheelPos * 3, 255 - WheelPos * 3);
  } else {
    WheelPos -= 170;
    return strip.Color(WheelPos * 3, 255 - WheelPos * 3, 0);
  }
}

####Przydatne linki
ATtiny85 Datasheet - Nota katalogowa użytego mikrokontrolera.

WS2812S Datasheet - Nota katalogowa LEDów w oczach.

Arduino Reference - Dokumentacja funkcji dostępnych w ArduinoIDE

Adafruit Neopixel - Poradnik i dokumentacja biblioteki do kontroli LEDów.

DumbPCS - Kompletny poradnik wgrywania bootloadera, większość z tego już załatwiłem. Was interesuje wyłącznie końcowa sekcja o wgrywaniu sketchy i naprawianiu sterowników.

  • *BOM - Bill of materials, lista elementów z przypisaniem do symboli na płytce
  • **GPIO - general purpose input/output, piny mikrokontrolera

Design Drawing

schematic diagram
PCB

BOM

IDNameDesignatorFootprintQuantity
1K2-1127SN-A4SW-01SW1,SW2KEY-SMD_ 4P-L4.3-W4.5-P3.40-LS6.02
2ZMM3V6D2,D1LL-34_L3.5-W1.5-RD2
34.7uFC2,C3C08052
4470R1R08051
5100nFC5,C4,C6,C8,C7,C9C08056

Attachments

OrderFile nameDownload times
No data
Clone
Add to Album
0
0
Share
Report

Comment

All Comments(1)
Sort by time|Sort by popularity
Followers0|Likes0
Related projects
Empty

Bottom Navigation