
Garek_V1
STDGarek_V1
License
:Description
##ElektroGarek
####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
####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
BOM
ID | Name | Designator | Footprint | Quantity |
---|---|---|---|---|
1 | K2-1127SN-A4SW-01 | SW1,SW2 | KEY-SMD_ 4P-L4.3-W4.5-P3.40-LS6.0 | 2 |
2 | ZMM3V6 | D2,D1 | LL-34_L3.5-W1.5-RD | 2 |
3 | 4.7uF | C2,C3 | C0805 | 2 |
4 | 470 | R1 | R0805 | 1 |
5 | 100nF | C5,C4,C6,C8,C7,C9 | C0805 | 6 |

Project Members

Comment