|
|
Řádek 142: |
Řádek 142: |
| {{#widget:YouTube|id=azfPoXOmKog|height=160|width=240|link=http://www.buildcircuit.com/decimal-to-binary-converter-using-cd4094-android-phone-and-bluesmirf/}} | | {{#widget:YouTube|id=azfPoXOmKog|height=160|width=240|link=http://www.buildcircuit.com/decimal-to-binary-converter-using-cd4094-android-phone-and-bluesmirf/}} |
|
| |
|
| | == Arduino - experimenty === |
|
| |
|
| ===Buzzer:===
| |
|
| |
|
| [http://www.instructables.com/id/Play-the-French-Can-Can-Using-an-Arduino-and-Buzze/?ALLSTEPS source]
| | <Gallery> |
| <source lang"C">
| | Soubor:arduino fotka.jpg|[[Arduino - Compatible 8X Seven Segments Display|Compatible 8X Seven Segments Display]] |
| // Buzzer example function for the CEM-1203 buzzer (Sparkfun's part #COM-07950).
| | Soubor:Arduiono-robot-pepik.jpg|[[Arduino - Jednoduchá aplikace|Jednoduchá aplikace - Robot Pepík - učebna D10]] |
| // by Rob Faludi
| | Soubor:arduino-spsavos.jpg|[[Arduino - pohybující text: SPS a VOS|Pohybující text: SPS a VOS Pisek]] |
| // http://www.faludi.com
| |
|
| |
|
| void setup() {
| | Soubor:arduino-pocitadlo.jpg|[[Arduino - datumové počítadlo|Počítadlo: roky - měsíce - dny - hodiny - minuty - sekundy]] |
| pinMode(4, OUTPUT); // set a pin for buzzer output
| | </Gallery> |
| }
| |
|
| |
|
| void loop() {
| |
| buzz(4, 2500, 500); // buzz the buzzer on pin 4 at 2500Hz for 1000 milliseconds
| |
| delay(1000); // wait a bit between buzzes
| |
| }
| |
|
| |
|
| void buzz(int targetPin, long frequency, long length) {
| |
| long delayValue = 1000000/frequency/2; // calculate the delay value between transitions
| |
| //// 1 second's worth of microseconds, divided by the frequency, then split in half since
| |
| //// there are two phases to each cycle
| |
| long numCycles = frequency * length/ 1000; // calculate the number of cycles for proper timing
| |
| //// multiply frequency, which is really cycles per second, by the number of seconds to
| |
| //// get the total number of cycles to produce
| |
| for (long i=0; i < numCycles; i++){ // for the calculated length of time...
| |
| digitalWrite(targetPin,HIGH); // write the buzzer pin high to push out the diaphram
| |
| delayMicroseconds(delayValue); // wait for the calculated delay value
| |
| digitalWrite(targetPin,LOW); // write the buzzer pin low to pull back the diaphram
| |
| delayMicroseconds(delayValue); // wait againf or the calculated delay value
| |
| }
| |
| }
| |
|
| |
| </source>
| |
|
| |
| ===Jednoduchá aplikace pro Arduino:===
| |
|
| |
|
| |
| <source lang"C">
| |
| /*
| |
| * Robot Pepík - učebna D10
| |
| * Tento program zobrazuje čas, který uběhl od spuštění programu
| |
| * - při každé 0té sekundě popojede dopředu
| |
| * - při každé první sekundě se zastaví
| |
| * - při každé desáté sekundě popojede zpět
| |
| * - při každé jedenácté sekundě se zastaví
| |
| */
| |
|
| |
| // přiložení knihovny pro práci s LCD
| |
| #include <LiquidCrystal.h>
| |
|
| |
| // inicializace LCD - nastavení používaných pinů
| |
| LiquidCrystal lcd(11, 9, 5, 4, 3, 2);
| |
|
| |
| //inicializace portů DC Motorů
| |
| int motor_left[] = {6, 7};
| |
| // pole obsahující ovládací piny levého motoru
| |
| int motor_right[] = {8, 10}; // pole obsahující ovládací piny pravého motoru void setup() { //DC motory - počáteční nastavení
| |
|
| |
| int i; for(i = 0; i < 2; i++){
| |
| pinMode(motor_left[i], OUTPUT);
| |
| pinMode(motor_right[i], OUTPUT);
| |
| }
| |
|
| |
| lcd.begin(16, 2); // nastavení rozsahu LCD monitoru
| |
|
| |
| lcd.setCursor(0, 0); // nastavení kurzoru na LCD na pozici 0:0
| |
| lcd.print("Minuty:"); // vytiskne text na LCD
| |
|
| |
| lcd.setCursor(0, 1); // nastavení kurzoru na LCD na pozici 0:0
| |
| lcd.print("Sekundy:"); // vytiskne text na LCD
| |
| }
| |
|
| |
| void loop() { // tato funkce se neustále opakuje
| |
| int sekundy = (millis()/1000); // zjištění a výpočet doby, od spuštění programu - v sekundách
| |
| int minuty = millis()/1000/60; // zjištění a výpočet doby, od spuštění programu - v minutách
| |
| sekundy -= minuty*60; // korekce času - po 60ti sekundách se sekundy vynulují
| |
| if(sekundy == 0) // když se sekundy rovnají 0, display se vymaže
| |
| {
| |
| lcd.setCursor(10, 0);
| |
| lcd.print(" ");
| |
|
| |
| lcd.setCursor(10, 1);
| |
| lcd.print(" ");
| |
|
| |
| drive_forward(); // v nulté sekundě se motor vždy rozjede dopředu
| |
| }
| |
|
| |
| lcd.setCursor(10, 0); // nastaví pozici kurzoru na LCD
| |
| lcd.print(minuty); // vytiskne čas, který uběhl od spuštění programu v minutách
| |
|
| |
| if(sekundy==1) // v první sekundě se motor vždy zastavý
| |
| {
| |
| motor_stop();
| |
| }
| |
| if(sekundy == 10) // v desáté sekundě se motor vždy rozjede dozadu
| |
| {
| |
| drive_backward();
| |
| }
| |
| if(sekundy == 11) // v jedenácté sekundě se motor vždy zastavý
| |
| {
| |
| motor_stop();
| |
| }
| |
|
| |
| lcd.setCursor(10, 1);
| |
| lcd.print(sekundy); // vytiskne čas, který uběhl od spuštění programu v sekundách
| |
| }
| |
|
| |
| void motor_stop(){ //zastaví DC motory
| |
| digitalWrite(motor_left[0], LOW);
| |
| digitalWrite(motor_left[1], LOW);
| |
|
| |
| digitalWrite(motor_right[0], LOW);
| |
| digitalWrite(motor_right[1], LOW);
| |
| delay(25);
| |
| }
| |
|
| |
| void drive_forward(){ //zapne DC motory směrem dopředu
| |
| digitalWrite(motor_left[0], HIGH);
| |
| digitalWrite(motor_left[1], LOW);
| |
|
| |
| digitalWrite(motor_right[0], HIGH);
| |
| digitalWrite(motor_right[1], LOW);
| |
| }
| |
|
| |
| void drive_backward(){ //zapne DC motory směrem vzad
| |
| digitalWrite(motor_left[0], LOW);
| |
| digitalWrite(motor_left[1], HIGH);
| |
|
| |
| digitalWrite(motor_right[0], LOW);
| |
| digitalWrite(motor_right[1], HIGH);
| |
| }
| |
|
| |
| void turn_left(){ //zapne DC motory a zatočí vlevo
| |
| digitalWrite(motor_left[0], LOW);
| |
| digitalWrite(motor_left[1], HIGH);
| |
|
| |
| digitalWrite(motor_right[0], HIGH);
| |
| digitalWrite(motor_right[1], LOW);
| |
| }
| |
|
| |
| void turn_right(){ //zapne DC motory a zatočí vpravo
| |
| digitalWrite(motor_left[0], HIGH);
| |
| digitalWrite(motor_left[1], LOW);
| |
|
| |
| digitalWrite(motor_right[0], LOW);
| |
| digitalWrite(motor_right[1], HIGH);
| |
| }
| |
| </source>
| |
|
| |
| == Arduino Compatible 8X Seven Segments Display ==
| |
|
| |
|
| |
| [[Soubor:Arduiono-7disp.jpg|300px]] [[Soubor:arduino fotka.jpg|300px]]
| |
|
| |
| Integrovaná tlačítka, LED & 7 segmentový display
| |
| - Vyžaduje pouze 3 IO výstupy k činnosti
| |
| - TM1638 chip micro-8 8-segment LED displayů a 8 tlačítek a 8 testovacíhc dvoubarevných Led kontrolek, IO zajišťují sériovou komunikaci rozhraní, 8 nastavovacích úrovní jasu.
| |
| Specifikace: 0.2 cm x 5.0 cm x 1.0 cm
| |
|
| |
| Programuje se v progamu Arduino pomoc jazyka C++ (možno sáhnout zde http://arduino.cc/en/Main/Software). V programu Arduino můžete také načíst funkční příklady z knihovny (možno stáhnout zde http://code.google.com/p/tm1638-library/)
| |
|
| |
| '''Příklad pro funkční modul'''
| |
| <source lang"C">
| |
| #include <TM1638.h>
| |
| #include <InvertedTM1638.h>
| |
|
| |
| #define NO_MODULES 2
| |
|
| |
| // define a regular module and a inverted module
| |
| TM1638 module1(3, 2, 4);
| |
| InvertedTM1638 module2(3, 2, 5);
| |
| TM1638* modules[NO_MODULES] = {
| |
| &module1,
| |
| &module2
| |
| };
| |
| byte modes[NO_MODULES];
| |
|
| |
| unsigned long startTime;
| |
|
| |
| void setup() {
| |
| startTime = millis();
| |
|
| |
| for (int i = 0; i < NO_MODULES; i++) {
| |
| modules[i]->setupDisplay(true, 7);
| |
| modes[i] = 0;
| |
| }
| |
| }
| |
|
| |
| void update(TM1638* module, byte* mode) {
| |
| byte buttons = module->getButtons();
| |
| unsigned long runningSecs = (millis() - startTime) / 1000;
| |
|
| |
| // button pressed - change mode
| |
| if (buttons != 0) {
| |
| *mode = buttons >> 1;
| |
| module->clearDisplay();
| |
| module->setLEDs(0);
| |
| }
| |
|
| |
| switch (*mode) {
| |
| case 0:
| |
| module->setDisplayToDecNumber(runningSecs, 1 << 7);
| |
| break;
| |
| case 1:
| |
| module->setDisplayToDecNumber(runningSecs, 1 << 6, false);
| |
| break;
| |
| case 2:
| |
| module->setDisplayToHexNumber(runningSecs, 1 << 5);
| |
| break;
| |
| case 4:
| |
| module->setDisplayToHexNumber(runningSecs, 1 << 4, false);
| |
| break;
| |
| case 8:
| |
| module->setDisplayToBinNumber(runningSecs, 1 << 3);
| |
| break;
| |
| case 16:
| |
| module->clearDisplayDigit((runningSecs - 1) % 8, 0);
| |
| module->setDisplayDigit(runningSecs % 8, runningSecs % 8, 0);
| |
| break;
| |
| case 32:
| |
| char s[8];
| |
| sprintf(s, "Secs %03d", runningSecs % 999);
| |
| module->setDisplayToString(s);
| |
| break;
| |
| case 64:
| |
| if (runningSecs % 2 == 0) {
| |
| module->setDisplayToString("TM1638 ");
| |
| } else {
| |
| module->setDisplayToString("LIBRARY ");
| |
| }
| |
|
| |
| module->setLED(0, (runningSecs - 1) % 8);
| |
| module->setLED(1 + runningSecs % 3, runningSecs % 8);
| |
| break;
| |
| case 65:
| |
| module->setDisplayToError();
| |
| break;
| |
|
| |
| }
| |
| }
| |
|
| |
| void loop() {
| |
| for (int i = 0; i < NO_MODULES; i++) {
| |
| update(modules[i], &modes[i]);
| |
| }
| |
| }
| |
|
| |
| </source>
| |
| '''Jednoduchý příklad pro jedno Arduino'''
| |
| <source lang"C">
| |
| #include <TM1638.h>
| |
|
| |
| // define a module on data pin 3, clock pin 2 and strobe pin 4
| |
| TM1638 module(3, 2, 4);
| |
|
| |
| void setup() {
| |
| // display a hexadecimal number and set the left 4 dots
| |
| module.setDisplayToHexNumber(0x1234ABCD, 0xF0);
| |
| }
| |
|
| |
| void loop() {
| |
| byte keys = module.getButtons();
| |
|
| |
| // light the first 4 red LEDs and the last 4 green LEDs as the buttons are pressed
| |
| module.setLEDs(((keys & 0xF0) << 8) | (keys & 0xF));
| |
| }
| |
| </source>
| |
|
| |
| '''Příklad pro pohybující se text'''- zde se bude psát SPS A VOS PISEK, nápis lze změnit jednoduchým přepsáním textu const char string, rychlost pohybu textu určuje delay
| |
| <source lang"C">
| |
| #include <TM1638.h>
| |
|
| |
| #define MODULES 4
| |
|
| |
| // define a modules
| |
| TM1638 modules[] = {
| |
| TM1638(3, 2, 4),
| |
| TM1638(3, 2, 5),
| |
| TM1638(8, 9, 5),
| |
| TM1638(8, 9, 4)
| |
| };
| |
|
| |
| void setup() {
| |
| }
| |
|
| |
| const char string[] = " SPS A VOS PISEK ";
| |
| int base = 0;
| |
|
| |
| void loop() {
| |
| for (int i = 0; i < MODULES; i++) {
| |
| const char* pos = string + base + (i * 8);
| |
|
| |
| if (pos >= string && pos + 8 < string + sizeof(string)) {
| |
| modules[i].setDisplayToString(pos);
| |
| } else {
| |
| modules[i].clearDisplay();
| |
| }
| |
| }
| |
|
| |
| base++;
| |
|
| |
| if (base == sizeof(string) - 8) {
| |
| base = -MODULES * 8;
| |
| }
| |
|
| |
| delay(300);
| |
| }
| |
|
| |
| </source>
| |
|
| |
| '''Příklad pro dva Displaye'''
| |
| <source lang"C">
| |
| #include "TM1638.h"
| |
|
| |
| // hello segments for display
| |
| const byte hello[] = {
| |
| 0b00000000, 0b01110110, 0b01111001, 0b00111000, 0b00111000, 0b00111111, 0b00000000, 0b00000000
| |
| };
| |
|
| |
| // define the first module
| |
| TM1638 module1(3, 2, 4);
| |
| // to chain modules, use the same clk and data - just specify a different strobe pin
| |
| TM1638 module2(3, 2, 5);
| |
|
| |
| unsigned long value = 0L;
| |
| boolean state = true;
| |
|
| |
| void setup()
| |
| {
| |
| // display the hello segments on module 1
| |
| module1.setDisplay(hello);
| |
| // display the hello segments on module 2
| |
| module2.setDisplay(hello);
| |
|
| |
| // light the lower 5 red LEDs and the top 5 green LEDs
| |
| module1.setLEDs(0b00011111 | 0b11111000 << 8);
| |
|
| |
| // light the 3rd red LED
| |
| module2.setLED(TM1638_COLOR_RED, 3);
| |
| // light the 5th green LED
| |
| module2.setLED(TM1638_COLOR_GREEN, 5);
| |
| // light the 7th red and green LEDs
| |
| module2.setLED(TM1638_COLOR_RED | TM1638_COLOR_GREEN, 7);
| |
| }
| |
|
| |
| void loop()
| |
| {
| |
| byte key1, key2;
| |
|
| |
| // read the buttons from the first module
| |
| key1 = module1.getButtons();
| |
| // read the buttons from the second module
| |
| key2 = module2.getButtons();
| |
|
| |
| // both pressed
| |
| if (key1 != 0 && key2 != 0) {
| |
| value = 0;
| |
|
| |
| // set the display to 0 on both modules if they have buttons pressed simultaneously
| |
| module1.setDisplayToHexNumber(value, 0b10101010);
| |
| module2.setDisplayToDecNumber(value, 0b01010101);
| |
| } else {
| |
| // check the first module buttons
| |
| if (key1 != 0) {
| |
| // show the pressed buttons of the first module on its display
| |
| module2.setDisplayToBinNumber(key1, 0);
| |
| // and on the LEDs
| |
| module1.setLEDs(key1);
| |
|
| |
| // check to see if it's the last button pressed
| |
| if (key1 & 128) {
| |
| // toggle the display state on/off
| |
| state = !state;
| |
| delay(200); // just wait for button up
| |
| }
| |
|
| |
| // set the intensity and display state
| |
| module1.setupDisplay(state, key1 >> 1);
| |
| }
| |
|
| |
| // check the second module buttons
| |
| if (key2 != 0) {
| |
| // just add it to the display value
| |
| value += key2;
| |
|
| |
| // display it as an hexadecimal on the first module
| |
| module1.setDisplayToHexNumber(value, 0b10101010);
| |
| // and as a decimal on the second module
| |
| module2.setDisplayToDecNumber(value, 0b01010101);
| |
|
| |
| // light the LEDs
| |
| module2.setLEDs(key2 << 8);
| |
| }
| |
| }
| |
| }
| |
|
| |
| </source>
| |
|
| |
| '''Počítadlo roky - měsíce - dny - hodiny - minuty - sekundy'''
| |
|
| |
| <source lang"C">
| |
| #include "TM1638.h"
| |
|
| |
| TM1638 module1(3, 2, 4);
| |
| TM1638 module2(3, 2, 5);
| |
|
| |
| int sec = 0;
| |
| int minu = 0;
| |
| int hour = 0;
| |
|
| |
| int day = 0;
| |
| int mon = 0;
| |
| int year = 0;
| |
|
| |
| void setup()
| |
| {
| |
| }
| |
|
| |
| void loop()
| |
| {
| |
| if (sec == 60) { sec = 0; minu++; }
| |
| if (minu == 60) { minu = 0; hour++; }
| |
| if (hour == 24) { hour = 0; day++; }
| |
|
| |
| if (day == 32) { day = 0; mon++; } // 31 dnu = mesic
| |
| if (mon == 13) { mon = 0; year++; }
| |
| if (year == 100) year = 0;
| |
|
| |
| module1.setDisplayToString(((day < 10) ? "0" : "") + (String)day + "-" + ((mon < 10) ? "0" : "") + (String)mon + "-" + ((year < 10) ? "0" : "") + (String)year);
| |
| module2.setDisplayToString(((hour < 10) ? "0" : "") + (String)hour + "-" + ((minu < 10) ? "0" : "") + (String)minu + "-" + ((sec < 10) ? "0" : "") + (String)sec);
| |
|
| |
| sec++;
| |
|
| |
| delay(1000);
| |
| }
| |
| </source>
| |
| [[Kategorie:SW]] | | [[Kategorie:SW]] |
| [[Kategorie:HW]] | | [[Kategorie:HW]] |
| [[Kategorie:MIT]] | | [[Kategorie:MIT]] |