© 2022 EasyEDA Some rights reserved
1.Easy to use and quick to get started
2.The process supports design scales of 300 devices or 1000 pads
3.Supports simple circuit simulation
4.For students, teachers, creators
1.Brand new interactions and interfaces
2.Smooth support for design sizes of over 30,000 devices or 100,000 pads
3.More rigorous design constraints, more standardized processes
4.For enterprises, more professional users
Std EditionGarek_V1
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
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.
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
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.
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:
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.
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);
}
}
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
ID | Name | Designator | Footprint | Quantity | BOM_Supplier | BOM_Manufacturer | BOM_Manufacturer Part | BOM_Supplier Part |
---|---|---|---|---|---|---|---|---|
1 | K2-1127SN-A4SW-01 | SW1,SW2 | KEY-SMD_ 4P-L4.3-W4.5-P3.40-LS6.0 | 2 | LCSC | HRO | K2-1127SN-A4SW-01 | C145886 |
2 | ZMM3V6 | D2,D1 | LL-34_L3.5-W1.5-RD | 2 | LCSC | SEMTECH | ZMM3V6 | C8057 |
3 | 4.7uF | C2,C3 | C0805 | 2 | LCSC | YAGEO | CC0805ZRY5V6BB475 | C326951 |
4 | 470 | R1 | R0805 | 1 | LCSC | Walsin Tech Corp | WR08X471 JTL | C384093 |
5 | 100nF | C5,C4,C6,C8,C7,C9 | C0805 | 6 | LCSC | WTC | 0805B104M500 | C94108 |
6 | SMF30CA_C353289 | D3 | SOD-123FL_L2.8-W1.8-LS3.7-BI | 1 | LCSC | Shandong Jingdao Microelectronics | SMF30CA | C353289 |
7 | ATTINY85-20SU | U1 | SOIC-8_L5.3-W5.3-P1.27-LS8.0-BL | 1 | LCSC | MICROCHIP | ATTINY85-20SU | C89852 |
8 | WS2812S-W | LED1,LED2 | LED-SMD_6P-L5.0-W5.0-TL | 2 | LCSC | Worldsemi | WS2812S-W | C114584 |
9 | 2KΩ | L1 | L0805 | 1 | LCSC | TAITEC | FCM2012HF-202T02 | C155075 |
10 | U254-051N-4BH806 | USB1 | MICRO-USB-SMD_U254-051N-4BH806 | 1 | LCSC | XKB Enterprise | U254-051N-4BH806 | C319170 |
11 | RE-H022TD-1190 (LF)(SN) | CN1 | HDR-TH_2P-P2.54-V | 1 | LCSC | JST Sales America | - | C160332 |
12 | 66.5 | R3,R4,R6 | R0805 | 3 | LCSC | Walsin Tech Corp | WR08X66R5FTL | C424788 |
13 | 1.5K | R2 | R0805 | 1 | LCSC | Guangdong Fenghua Advanced Tech | RS-05K152JT | C304820 |
14 | 22uF | C1 | C0805 | 1 | LCSC | SAMSUNG | CL21A226MQQNNNE | C5674 |
Unfold