Editor Version ×
Standard

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

Profession

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 edition Garek_V1

No Profile

License:

Published Time: 2020-09-28 23:02:58
  • 554
  • 0
  • 0
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
1 /
PCB
1 /
Empty
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

Project Attachments
Empty
Project Members
Add to album ×

Loading...

reminder ×

Do you need to add this project to the album?

服务时间

周一至周五 9:00~18:00
  • 0755 - 2382 4495
  • 153 6159 2675

服务时间

周一至周五 9:00~18:00
  • 立创EDA微信号

    easyeda

  • QQ交流群

    664186054

  • 立创EDA公众号

    lceda-cn