bot
Vytvořené odpovědi
-
AutorPříspěvky
-
Dan
ÚčastníkJednou za čas proměnná v millis() přeteče a začíná čítat opět od nuly. Pokud se nemýlím, uvedený příklad s tím vůbec nepočítá a poté by podsvětlení displeje zůstalo svítit až do dalšího stisku klávesy…
Dan
ÚčastníkNa takovéto jednoduché zadání navrhuji koupit si miniaturní modul s attiny85, který má zároveň i usb port (vypadá jako flashdisk – je to pohodlné řešení pro naprogramování pomocí IDE) a k němu dva moduly relé (jedno bude spínat směr vpřed, druhé směr vzad – tyto moduly mají tranzistorový či opto spínač cívky, takže je lze zapojit přímo na výstup attiny85). Ty moduly vybírejte ovšem takové, aby měly proříznutý plošný spoj kvůli izolaci mezi napětími cívky a kontaktů. Čas navrhuji počítat v programu obyčejným čítačem, odladění jistě nebude problém. Modul attiny85 má 5 i/o pinů, takže je rezerva i na případná dvě tlačítka, kterými si lze za provozu měnit časování bez připojování k počítači, a jednu led diodu indikující počtem bliknutí nastavený čas. Nastavené časování lze jednoduše ukládat do vnitřní eeprom paměti čipu, takže nebude po případném odpojení napájení zapomenuto. Náklady na toto řešení jsou kolem stovky, plošný spoj žádný, moduly se jen propojují drátky.
djvvv
ÚčastníkAhoj v případě brždění,velkého namáhání,použití silných motorů bych možná volil nějaký ten regulátor pro rc autíčka mám pro příklad autíčko s regulátorem tazer T15.jeho specifikace v angličtině :
Forward:Yes
Reverse:Yes
Brake:Yes
Time Delay Brake:Yes
Continuous Maximum Current:250 amperes
Input Voltage:4-cell (4.8 volts) to 7-cell (8.4 volts) DC Ni-MH 2S (7.4 volts) Li-Po
PWM Frequency:2kHz
Overload Protection:Yes Thermal
Full On Resistance:0.0014 ohms
Cells w/BEC:5V DC, 1 amp max.
Motor mám Johnson typ 540 je to silný motor který se používá i do aku vrtaček.
Zatím jen mám problém to oživit a ovládat,mám podezření,že se mi ten regulátor porouchal,nebo že neposílám signál správné frekvence.Serva jsou ovládána pwm 1-2 ms.tomig
ÚčastníkDíky. To jsem včera našel nezávisle taky.
Ale ta cena >500 Kč je celkem smutná 🙁BlindP
ÚčastníkAhoj, našel jsem tohle – https://hallard.me/max31865/
AmigA
ÚčastníkHello všem!
Koupil jsem si 2.4″ TFT LCD Shield a nemohu k němu najít schéma zapojení.
Je na něm http://www.mcufriend.com ale stránka je nedostupná.
Existuje více variant, já mám tuto: http://i.imgur.com/Nj2jYfz.jpg
Googlil jsem několik dní a nic nenašel.Má někdo z Vás schéma zapojení?
kejlicz
ÚčastníkDíky za info. Já jsem to už zapojil. Jako vodiče jsem použil klasický ethernetový kabel a při délce 10 m nejsou vůbec žádné problémy.
MartinCE
ÚčastníkDobrý den,
nedávno jsem také řešil podobný problém.
Čidla pracují se sběrnicí One-wire. Na jednom webu jsem se dozvěděl, že maximum je 100m na jiném 60m.
Na delší vzdálenost bych doporučil kroucenou dvoulinku a galvanické oddělení…
Na svém projektu jsem si vystačil s 1m dlouhým kabelem, který byl u čidel.Martin
BlindP
ÚčastníkAhoj, zkus použít funkci Millis pro časování viz příklad „BlinkWithoutDelay“.
const int ledPin = 13; const int tlac = 7; unsigned long previousMillis = 0; const long interval = 5000; void setup() { pinMode(ledPin, OUTPUT); pinMode(tlac, INPUT); } void loop() { if(digitalRead(tlac) == LOW) { previousMillis = millis(); digitalWrite(ledPin, HIGH); } unsigned long currentMillis = millis(); if(currentMillis - previousMillis >= interval) { digitalWrite(ledPin, LOW); } }
Po stisknutí tlačítka sepne led a po 5 vteřinách zhasne.
B.Boban
ÚčastníkAhoj mohl by si prosim poskytnout odkaz na knihovnu OneWire co pouzivas? mam v planu k Attiny pripojit to same cidlo a jeste modul 433MHz a pak to posilat do UNA a teplotu zobrazovat na displeji. Pripadne kdyby si sem moch dat tvuj kod pro inspiraci bylo by to fajn. Diky Boban
staricek
ÚčastníkMám stejný problém. Našel jsi nějaké řešení?
Používám stejný modul, stejnou libqmax
ÚčastníkAno, to je muj problem. Teda asi spis byl. Zjistil jsem ze to blikani asi zpusobuji nestinene vodice k diodam(pouzivam ploche kabely a jsou polozene pres sebe). Kdyz k sobe ty kabely pritlacim tak to zacne blikat, kdyz je dam od sebe tak to sviti vpohode.
tibordoma
ÚčastníkKolega mi poradil, že keďže podľa tých obrázkov na Merkur board je vždy 5V v strede, tak keď to dám aj opačne, tak to nezhorí. Tak som skúsil obidve kombinácie a jedna z nich fungovala.
Takže teraz som sa pustil do rozbehávania senzora – http://oi59.tinypic.com/34j7vw4.jpg – hore na dopravníku na červenej vodorovnej „tyči“. Tu je označený ako QRDx1 – http://i.snag.gy/Su8QI.jpg . Pripojil som to na Arduino na analógový port a sledoval výstup senzora. Predpokladám, že by to mal byť RGB senzor, nakoľko v popise dopravníka je toto „Set obsahuje mechanické části a je vybaven infa čidly, RGB senzorem, řídící elektronikou a displejem 4×20 mm.“ Ale ako rozoznávať farby, na to som neprišiel, ani som si nevšimol nejaké zmeny vo výstupe pri rozdielnych farbách. Skôr sa mi zdá, že reaguje všeobecne na svetlo. Možno to nesprávne používam. Skúsim vypýtať od Merkuru datasheet k tomu senzoru.
Zbyšek Voda
ÚčastníkV pohodě.
Buď si koupíte nějaký relé shield a pak jednotlivá relé ovládáte třeba tak, že je zapínáte/vypínáte LOW/HIGH na pinu, nebo si koupíte relé, připojíte k němu nějaký budič (třeba ULN2003a) a ovládáte je pomocí něho.krokodile
ÚčastníkSuper, díky za odpověď. Jak se potom řeší to napojení na relé? Omlouvám se za hloupé dotazy, ale nejsem problematikou se moc nezabývám…
Zbyšek Voda
ÚčastníkTohle zvládne jakékoliv Arduino 🙂 Klidně Nano, UNO…
Ještě bych k tomu přidal nějaký modul reálného času (RTC) pro lepší přehled v čase.Zbyšek Voda
ÚčastníkJsem rád, že se problém vyřešil 🙂
Decadics
ÚčastníkTak už jsem to vyřešil. Chyběla mi zem na pinu RW u LCD displeje. Nicméně teď budu řešit problém, jak to rozchodit přes ten I2C převodník, u kterého se mi to chovalo stejně. každopádně jsem rád, že LCD je v pořádku a příště si nejprve pořádně překontroluju zapojení, než budu někam něco psát. Díky za Váš čas. 😉
Pidrman
ÚčastníkDobrý den
Tak jsem program upravil. Snad dobře.
#include <LiquidCrystal.h>
#include <TimerOne.h>// buttons code
#define btnRIGHT 0
#define btnUP 1
#define btnDOWN 2
#define btnLEFT 3
#define btnSELECT 4
#define btnNONE 5// directions
#define FORWARD HIGH
#define BACKWARD LOW// debounce time (milliseconds)
#define DEBOUNCE_TIME 200// PINs for Pololu controller
#define PIN_STEP 2
#define PIN_DIR 3// lookup table speed – ticks (interrupts)
const int speed_ticks[] = {-1, 600, 300, 200, 150, 120, 100, 86, 75, 67, 60, 55, 50, 46, 43};// global variables
LiquidCrystal lcd(8, 9, 4, 5, 6, 7);int actual_speed;
int actual_direction;int ticks;
unsigned long tick_count;int button;
boolean debounce;
int previous_time;// custom LCD square symbol for progress bar
byte square_symbol[8] = {
B11111,
B11111,
B11111,
B11111,
B11111,
B11111,
B11111,
};// string constants
char forward_arrow[] = „->“;
char backward_arrow[] = „<-„;void setup() {
// init the timer1, interrupt every 0.1ms
Timer1.initialize(100);
Timer1.attachInterrupt(timerIsr);// init LCD and custom symbol
lcd.begin(16, 2);
lcd.setCursor(0,0);
lcd.createChar(0, square_symbol);// pins direction
pinMode(PIN_STEP, OUTPUT);
pinMode(PIN_DIR, OUTPUT);// initial values
actual_speed = 0;
actual_direction = FORWARD;
tick_count = 0;
ticks = -1;
debounce = false;digitalWrite(PIN_DIR, actual_direction);
updateLCD();
}void loop() {
// check if debounce active
if(debounce) {
button = btnNONE;
if(millis() > previous_time + DEBOUNCE_TIME) debounce = false;
} else button = read_buttons();// if a button is pressed, start debounce time
if(button != btnNONE) {previous_time = millis();
debounce = true;
}// check which button was pressed
switch(button) {case btnUP:
increase_speed();
break;
case btnDOWN:
decrease_speed();
break;
case btnLEFT:
change_direction(BACKWARD);
break;
case btnRIGHT:
change_direction(FORWARD);
break;
case btnSELECT:
emergency_stop();
break;
}// finally update the LCD
updateLCD();
}// increase speed if it’s below the max (70)
void increase_speed() {if(actual_speed < 70) {
actual_speed += 5;
tick_count = 0;
ticks = speed_ticks[actual_speed / 5];
}
}// decrease speed if it’s above the min (0)
void decrease_speed() {if(actual_speed > 0) {
actual_speed -= 5;
tick_count = 0;
ticks = speed_ticks[actual_speed / 5];
}
}// change direction if needed
void change_direction(int new_direction) {if(actual_direction != new_direction) {
actual_direction = new_direction;
digitalWrite(PIN_DIR, actual_direction);
}
}// emergency stop: speed 0
void emergency_stop() {
actual_speed = 0;
tick_count = 0;
ticks = speed_ticks[actual_speed / 5];
}// update LCD
void updateLCD() {// print first line:
// Speed: xxxRPM -> (or <-)
lcd.setCursor(0,0);
lcd.print(„SPEED: „);
lcd.print(actual_speed);
lcd.print(„RPM „);lcd.setCursor(13,0);
if(actual_direction == FORWARD) lcd.print(forward_arrow);
else lcd.print(backward_arrow);// print second line:
// progress bar [##### ]
// 15 speed steps: 0 – 5 – 10 – … – 70
lcd.setCursor(0,1);
lcd.print(„[„);for(int i = 1; i <= 14; i++) {
if(actual_speed > (5 * i) – 1) lcd.write(byte(0));
else lcd.print(“ „);
}lcd.print(„]“);
}// timer1 interrupt function
void timerIsr() {if(actual_speed == 0) return;
tick_count++;
if(tick_count == ticks) {
// make a step
digitalWrite(PIN_STEP, HIGH);
digitalWrite(PIN_STEP, LOW);tick_count = 0;
}
}// read buttons connected to a single analog pin
int read_buttons() {int adc_key_in = analogRead(0);
if (adc_key_in > 1000) return btnNONE;
if (adc_key_in < 50) return btnRIGHT;
if (adc_key_in < 195) return btnUP;
if (adc_key_in < 380) return btnDOWN;
if (adc_key_in < 555) return btnLEFT;
if (adc_key_in < 790) return btnSELECT;
}Ale problém přetrvává 🙁
Zbyšek Voda
ÚčastníkDobrý den,
to rozhodně schválně není. Vaše chyba je ale podivná. Zkoušel jsem ji reprodukovat ve více prohlížečích, ale všude mi zobrazování funguje správně (ať už stránkování na úvodní stránce, nebo v Novinky).
Když půjdete třeba sem: https://bastlirna.hwkitchen.cz/page/3/, zobrazí se vám třetí stránka novinek, nebo úvodní stránka?
Zbyšek Voda
ÚčastníkDobrý den,
když tak zběžně koukám na váš program, napadá mě jedna věc. Snad to bude ono.
Na začátku máte:
Timer1.initialize(100); Timer1.attachInterrupt(timerIsr);
což zapříčiní, že se bude funkce timerIsr volat každých 100µs.
Funci timerIsr máte definovanou jako
void timerIsr() { if(actual_speed == 0) return; tick_count++; if(tick_count == ticks) { // make a step digitalWrite(PIN_STEP, HIGH); digitalWrite(PIN_STEP, LOW); tick_count = 0; } }
čili každých 100µs se proměnná tick_count zvýší o jednu (pokud neplatí speciální podmínky – ty teď ale přeskočme). Proměnná tick_count je typu int.
int tick_count;
a to by mohl být ten problém. Proměnné typu int mohou uchovávat čísla od -32.768 do 32.767. Vy ale nemáte nijak pojištěno, co se stane, když vám tick_count přeteče.
Jako první krok zkuste použít jiný typ – například unsigned long, který může mít rozsah od 0 do 4.294.967.295.
unsigned long tick_count;
Pokud se problém vyřeší (respektive se o hodně odloží), budeme mít jistotu, že to byl skutečně problém použitého datového typu.
Poté můžete zkusit dodělat detekci přetečení proměnné. Jelikož ale při zvýšení každých 100µs „vydrží“ tato proměnná počítat asi pět dní, neviděl bych to jako nutnost 🙂
Zbyšek Voda
ÚčastníkDobrý den,
problémem v rychlosti myslíte to, že se řádky rozsvěcují moc pomalu a nevznikne pak dojem, že svítí všechny naráz?
Zkuste nám sem poslat váš program, to by také mohlo pomoci.
Dan
ÚčastníkOdpovím si tedy sám, na anglickém fóru mi poradili v mžiku. Attiny85 musím provozovat na 8Mhz a výš. Přepnul jsem obvod na vnitřní oscilátor 8 MHz a vše začalo fungovat k naprosté spokojenosti. 🙂
HadrDisk
ÚčastníkTrošku upravená verze 0.0002 :))
int soft = 7; //zapnutí trafa přes odpor
int tr = 8; //zapnutí trafa bez odporu
int repro = 9; //zpožděné připojení repro + ochrana před DC
int buttonPin = 10; //Tlačítko power
int led = 13; //Kontrolka (při DC na výstupu zesilovače bliká do resetu obvodu)
int DC1 = analogRead(A0); //ochrana L kanálu
int DC2 = analogRead(A1); //ochrana P kanáluboolean currentState = LOW;//stroage for current button state
boolean lastState = LOW;//storage for last button state
boolean ledState = LOW;//storage for the current state of the LED (off/on)void setup() {
pinMode(buttonPin, INPUT);//this time we will set the pin as INPUT
pinMode(repro, OUTPUT);
pinMode(soft, OUTPUT);
pinMode(tr, OUTPUT);
pinMode(led, OUTPUT);
Serial.begin(9600);}
void loop() {
int DC1 = analogRead(A0);
int DC2 = analogRead(A1);
Serial.println(DC2); //informace pro nastavení napětí
delay(100);currentState = digitalRead(buttonPin);
while ((DC1 > 800 && lastState < 800)) {
digitalWrite(tr, LOW);
digitalWrite(soft, LOW);
digitalWrite(repro, LOW);
digitalWrite(led, HIGH);
delay(200);
digitalWrite(led, LOW);
delay(200);
}while (DC2 > 800 && lastState < 800) {
digitalWrite(tr, LOW);
digitalWrite(soft, LOW);
digitalWrite(repro, LOW);
digitalWrite(led, HIGH);
delay(200);
digitalWrite(led, LOW);
delay(200);
}if (currentState == HIGH && lastState == LOW) {
delay(10);//crude form of button debouncing
if (ledState == HIGH) {
digitalWrite(repro, LOW);
delay(200);
digitalWrite(soft, LOW);
digitalWrite(led, LOW);
digitalWrite(tr, LOW);
ledState = LOW;
} else {
digitalWrite(led, HIGH);
digitalWrite(soft, HIGH);
delay(1000);
digitalWrite(tr, HIGH);
delay(60);
digitalWrite(soft, LOW);
delay(3000);
digitalWrite(repro, HIGH);
ledState = HIGH;
}
}
lastState = currentState;
}Ocením nějaké návrhy na zjednodušení a případný reset blikající LEDky dlouhým stiskem tlačítka :))
Předem díky za nápady :))
Decadics
ÚčastníkDěkuji za rady, mrknu, jestli je vše, co jste popsal v pořádku. Pokud ano, koupím raději nový a originální arduino displej. Hzeký den. 🙂
Zbyšek Voda
ÚčastníkProgram bude v pořádku. Mě tohle normálně fungovalo.
Nabízí se tedy hledat problém někde jinde. Koukal jsem třeba sem: http://stackoverflow.com/questions/9217084/arduino-lcd-only-showing-black-boxes-on-bottom-rowNabízí tam vícero tipů.
- Zkontrolovat zapojení – jestli nemáte nějaký vadný vodič.
- Zkontrolovat, jestli jsou piny dobře připájené k LCD.
- Před lcd.begin() dát delay(1000) – display by mohl potřebovat čas na naběhnutí
- Ujistěte se, jestli se program skutečně nahrál do Arduina (zkuste třeba nahrát blikání LEDkou a pak zase zpět na LCD hello world)
Takhle na dálku mě nenapadá nic dalšího.
Decadics
ÚčastníkDěje. Při otáčení poťákem se mění kontrast. Od svetlého do nejtmavšího. Regulací kontrastu to asi nebude. Na netu jsem našel vícero lidí, kteří měli stejný problém. Jen se to na těch fórech nikdy nedořešilo do konce. Takže se jedná o obvyklý problém, ale neznám řešení. Možná bude něco špatného v kódu, nebo bude špatná knihovna?
Zbyšek Voda
ÚčastníkTakže když točíte kontrastním potenciometrem, tak se nic neděje?
Přijde mi, že toto dělá displej, když má nastavený maximální kontrast.Decadics
ÚčastníkDobrý den,
zařízení jsem již rozebral a oddělil jsem I2C převodník od LCD s tím, že se pokusím o klasické zapojení bez I2C převodníku abych vyloučil jeho poškození. Bohužel, problém přetrvává i bez I2C převodníku. Displej zobrazuje to samé, co předtím. Z I2C modulu jsem použil jen potenciometr abych mohl štelovat kontrast.
Foto: http://decadics.rajce.idnes.cz/ARDUINO_-_LCD_PROBLEM#ARDUINO2.jpg
Zdroják:
/*
LiquidCrystal Library – Hello WorldDemonstrates the use a 16×2 LCD display. The LiquidCrystal
library works with all LCD displays that are compatible with the
Hitachi HD44780 driver. There are many of them out there, and you
can usually tell them by the 16-pin interface.This sketch prints „Hello World!“ to the LCD
and shows the time.The circuit:
* LCD RS pin to digital pin 12
* LCD Enable pin to digital pin 11
* LCD D4 pin to digital pin 5
* LCD D5 pin to digital pin 4
* LCD D6 pin to digital pin 3
* LCD D7 pin to digital pin 2
* LCD R/W pin to ground
* 10K resistor:
* ends to +5V and ground
* wiper to LCD VO pin (pin 3)Library originally added 18 Apr 2008
by David A. Mellis
library modified 5 Jul 2009
by Limor Fried (http://www.ladyada.net)
example added 9 Jul 2009
by Tom Igoe
modified 22 Nov 2010
by Tom IgoeThis example code is in the public domain.
http://www.arduino.cc/en/Tutorial/LiquidCrystal
*/// include the library code:
#include <LiquidCrystal.h>// initialize the library with the numbers of the interface pins
LiquidCrystal lcd(12, 11, 5, 4, 3, 2);void setup() {
// set up the LCD’s number of columns and rows:
lcd.begin(16, 2);
// Print a message to the LCD.
lcd.print(„hello, world!“);
}void loop() {
// set the cursor to column 0, line 1
// (note: line 1 is the second row, since counting begins with 0):
lcd.setCursor(0, 1);Zbyšek Voda
ÚčastníkDobrý den, můžete sem postnout fotku vašeho zapojení? 🙂
-
AutorPříspěvky