-
Fototrend
Arduino hardverrel és szoftverrel foglakozó téma. Minden mikrovezérlő ami arduinoval programozható, és minden arduino program, board, és hardverrel kapcsolatos kérdések helye.
Új hozzászólás Aktív témák
-
Janos250
őstag
Az a baj, hogy nem tudsz címet, hogy hova tedd. Ha tudod a címet, közvetlen címzéssel bárhova lerakhatsz bármit, de honnan tudod, hogy hova? A regisztereit az ESP32-nek például közvetlen címzéssel érem el.
Assemblyt én az ESP32-n még csak egyetlen dologra használtam:
Van egy regiszter az ESP32-ben, ami a 80 Mhz-es ciklusokat számolja, ezzel elég pontos időzítést lehet csinálni. Viszont ez a regiszter cím olvasással nem érhető el, csak van egy assembly utasítás, ami ezt kiolvassa. Elég hülye ötlet, de így van. -
-
Janos250
őstag
válasz
ekkold #17364 üzenetére
Nem tudok róla, hogy meg lehetne adni a címet. Igazából azt se tudom, hogy a sima konstansokat hova teszi, a programszövegbe-e.
Én néha így adok meg, pl. az említettet:const char httpHeader[] PROGMEM = R"=====(
de igazából nem tudom, hogy van-e jelentősége.
Még soha nem néztem meg, mi a címe akkor, ha van PROGMEM, vagy ha nincs. -
Janos250
őstag
A C++11 hozta be a raw string (R string) kezelését, és az ESP32 tudja.
A hagyományos stringnél csak macerásan oldható meg pár dolog, pl:\n
a sorváltás, és nem azt látod a programszövegben, ami majd ténylegesen lesz.
A raw string esetén nem kell escape-elni, hanem nyugodtan írhatod bele a sorváltást, tabulátort, miegymást, pontosan azt látod a program szövegében, ahogy az majd megjelenik például kinyomtatva. Én ezért szeretem használni. -
-
Janos250
őstag
Ígértem leegyszerűsített ESP32 WEB szerver mintát.
Nem tudom aktuális-e még, itt van egy végletekig leegyszerűsített változat:// felhasznalva:
// https://lastminuteengineers.com/creating-esp32-web-server-arduino-ide/
// reszletesebben lsd ott
#include <WiFi.h>
#include <WebServer.h>
using namespace std;
const char* ssid = "********";
const char* password = "********";
IPAddress ip(192, 168, 0, 30); // ez lesz az ESP32 IP cime
IPAddress dns(192, 168, 0, 1); // ehhez az IP-ju WiFi routerhez fog kapcsolodni
IPAddress gateway(192, 168, 0, 1); // a router a gateway is
IPAddress subnet(255, 255, 0, 0); // a Wifi router maskja. ha nem tudod, akkor ez tobbnyire jo
IPAddress primaryDNS(8, 8, 8, 8); //optional lehet a router is
IPAddress secondaryDNS(8, 8, 4, 4); //optional
WebServer server(80);
const char htmlHeader[] = R"=====(
<!DOCTYPE html>
<html lang = hu >
<head>
<meta charset="UTF-8">
<title>minta WEB szerver</title>
</head>
)=====";
void serverValaszolHTMLtexttel() {
String htmlstring = htmlHeader ; // csak Arduino String (nagybetus) jo, string (C++ kisbetus string) nem!
htmlstring += "<body>" ;
htmlstring += "\n Hello, World!\n <br>\n" ;
htmlstring += " ide jonnek a feldat szerinti dolgok\n <br>\n" ;
//egy minta: https://lastminuteengineers.com/creating-esp32-web-server-arduino-ide/
htmlstring += "</body>\n</html>" ;
server.send(200, "text/html", htmlstring);
} ;
void handle_NotFound(){
server.send(404, "text/plain", "Not found");
} ;
void setup(void) {
//************************************
// Ez a szokasos
Serial.begin(115200);
delay(2000);
WiFi.begin(ssid, password);
if(!WiFi.config(ip, gateway, subnet, dns, secondaryDNS)) {
Serial.println("STA Failed to configure");
}
Serial.print("Connecting to ");
Serial.println(ssid);
while (WiFi.status() != WL_CONNECTED) {
delay(500);
Serial.print(".");
}
// Print local IP address and start web server
Serial.println("");
Serial.println("WiFi connected.");
Serial.println("IP address(ESP32): ");
Serial.println(WiFi.localIP());// this will display the Ip address of the Pi which should be entered into your browser
//*************************************************
// mit kuldjon, ha egy client bejelentkezik
server.on("/", serverValaszolHTMLtexttel);
// mit kuldjon, ha hibas az URL
server.onNotFound(handle_NotFound);
server.begin();
Serial.println("HTTP server started");
Serial.print ("ezt ird be a bongeszo cimsoraba:http://");
Serial.println(WiFi.localIP()) ;
} ; // end setup
void loop(void) {
server.handleClient();
delay(50);
} ; // end loop -
Janos250
őstag
A freeRTOS mindenképpen fut, és nem is kell róla tudomást venni, ha nem akarod, pont ugyanúgy használhatod, mint ha mondjuk UNO lenne.
Ugyanúgy van a main.cpp lényege (kikeresheted):setup();
for(;;) {
A mindenféléket beállítja neked, nem kell vele bogarászni, el is felejtheted, hogy freeRTOS alatt fut, ha nem akarod a két magot kihasználni.Nem nagyon van a freeRTOS-hoz használati utasítás a espressifen kívül
https://docs.espressif.com/projects/esp-idf/en/latest/esp32/api-reference/system/freertos.html
de nem is igen kell .
Igazából az ember a xTaskCreatePinnedToCore API-t használja, ha meg akarja adni, hogy melyik magon fusson, vagy ha ráhagyod az oprendszerre, akkor meg az xTaskCreate.
Ha nem akarod, nem is látod ezeket a függvényeket, ő automatikusan az 1-es magon futtatja, ha nem beszélsz bele, hanem mondjuk egy UNO programot futtatsz.
Esetleg a vTaskDelete, vTaskDelay ( de a delay is erre fordítódik) , az xTaskDelayUntil, uxTaskPriorityGet, eTaskGetState, vTaskGetInfo, vTaskPrioritySet. Ezek nevei magukért beszélnek, a leírásuk , és a paramétereik a linken ott vannak.
Én akartam még használni a vTaskList-et, de az meg az Arduinora fordított verzióban nem működik, mert az meg csak akkor működik, ha valami debug módot is beállítottak volna, azt meg utólag - állítólag - nem lehet.
A WiFi-re majd írok konkrét példákat, és felteszem valahova.
Többféle módon használhatod. -
Janos250
őstag
Erre mindenki mást javasol.
Az én véleményem:
Elsődlegesen a WiFi használata. Szerverre van többféle verzió a neten, mind kicsit más.
Én nem azokat használom, hanem az alapot, tömören a lényege:WiFiServer server(80);
WiFiClient client ;A loopban pedig a lényeg:
client = server.available();
if (client.available()) { // if there's bytes to read from the client,
char c = client.read();Természetesen még jönnek hozzá a sallangok, például, hogy vége akkor van, ha két cr/lf jön egymásután.
client.println(protocolHeader);
client.println(httpHeader);
client.print(body01);A végén:
client.stop();
Ezt így alapszinten használom. Ha valamelyik kész httpserver kezelőt használod, az egyszerűbb, de nekem ez kényelmes, és rugalmas.
Olyasmi, mint a PHP, hogy írod azt, amit a WEB lapodra akarsz tenni.Aztán ott van az OS, a freeRTOS, amire sokan mondják, hogy igazából nem is OS, mert pl. nincsenek benne userek.
Ezzel az esetek zömében nem kell foglalkozni, nem kell, hogy a user lássa.
Ha párhuzamosan akarsz taskokat futtatni, akkor vagy a szabványos C++ módon teszed, és az OS eldönti, melyik magra teszi:thread szal1(helloWorld1);
thread szal2(helloWorld2);
szal1.join();
szal2.join();A join akkor kell, ha be kell várni az adott szál befejezését,
vagy kreálsz neki külön taskot, például:
xTaskCreate(
readTempr,
"homersekletOlvas",
5000,
NULL,
6,
&homeroTaskHandle
);Én ezzel például olvasom a hőmérsékleteket mindentől függetlenül a "readTempr" függvénnyel, és belerakom globális változókba, ezért nincs szükség paraméterekre, azaz NULL nullpointer. Itt szokott egy kis gubanc lenni annak, aki először használja, mert ide a paraméterekre (pl töm, struktúra) mutató pointert írunk, de az xTaskCreate void típusú pointert kér, ezért kényszerítéssel voidosítani kell, majd a függvényben ismét kényszeríteni az adott típusra. Ha el akarod dönteni, hogy melyik magra tedd, akkor azt is megadhatod. Én például szeretem az ilyen mellékes dolgokat a 0-ás magra tenni, mert ott fut magas prioritással a WiFi kezelés, az üresjáratokban pedig az én "mellékes" függvényeim, egymástól függetlenül. Például amit az előbb írtam, abban végtelen ciklus van. Beolvassa a hőmérsékleteket, beleteszi globális változóba, vár egy időt, majd újra olvas. Ilyen esetben a wait az nem tényleges várakozás, hanem a többi tasknak adja át a vezérlést. Mivel a hőmérsékletek byte-ban vannak, nem kell semmiféle zárás, hogy ne akkor olvasson az egyik, amikor már az adatok felét átírta a másik, és akkor hülyeséget kapjon, de ha több byte-os az adat, akkor kizárás szükséges..
Aztán célszerű a rengeteg hardver perifériát kipróbálni.
-
-
Janos250
őstag
Szia!
Köszi, van, ami megy, de egyre rejtélyesebb.Van ugyebár két Arduino fejlesztés az ESP32-re.
Van egyszer, amit az espressif-nél van, valami régebbi IDF alapján, és ezt 1.0.6 verziónak nevezi. Ez, ha a File/Preferences-be ezt írjuk be:
https://dl.espressif.com/dl/package_esp32_index.jsonAztán van a github-on, a 2.0.2 verziónak nevezett, amit folyamatosan fejlesztenek aktív emberek, ez jelenleg a 4.4-es IDF alapján.
https://github.com/espressif/arduino-esp32/releases/download/2.0.2/package_esp32_index.jsonAz espressifesben megy a fájlkezelés úgy, ahogy egyszer korábban leírtam:
https://prohardver.hu/tema/arduino/hsz_16613-16613.html
Viszont nem megy az általad javasolt.A githubosban nem megy a fenti fájlkezelés, de - ha az IDF-ből bemásolom neki, amiért nyavalyog -, akkor megy, amit leírtál.
Ez alapján sikerült kiíratni azokat a dolgokat, amit tulajdonképpen akartam. Tulajdonképpen az s_vfs-et akartam leírni, csak egyszerűen akartam megfogalmazni, mert ez is ugyanolyan
FD_SETSIZE = 64
s_vfs[0] = 3ffb6d70
vfs = 3ffb6e10
path_prefix[] = /dev/uart
path_prefix_len = 9
ctx = 0
offset = 0
s_vfs[1] = 3ffb6e3c
vfs = 3ffb6edc
path_prefix[] = /dev/console
path_prefix_len = 12
ctx = 0
offset = 1Szóval a fene se érti.
Még majd bogarászok vele. -
Janos250
őstag
Szevasztok.
Egyszer már próbálkoztam ezzel, de abbamaradt.
Van nekem egy fájl: libvfs.a
Ebben van egy változó: s_vfs_countA program valahogy eléri, mert használja, de nem tudok rájönni, én hogyan tudnám elérni. Például kiíratni (Ja, ESP32 Arduino természetesen)
-
Janos250
őstag
válasz
Tomika86 #17229 üzenetére
Az ESP32-höz tartozó main.cpp része:
void loopTask(void *pvParameters)
{
setup();
for(;;) {
if(loopTaskWDTEnabled){
esp_task_wdt_reset();
}
loop();
if (serialEventRun) serialEventRun();
}
}Vagyis:
Meghívja a setup függvényt egyszer, majd egy végtelen for ciklusban a loop() függvényt.
Ha a setupba teszel valamit, annak egyszer le kell futnia.
Én továbbra is időzítési problémára gyanakszom, bár gyanús, hogy fgv nélkül megy. -
Janos250
őstag
válasz
Tomika86 #17220 üzenetére
Hát, a lényegét nem sikerült elkapni! :-(
Az csak egy megjegyzés volt, hogy minek írsz négy sort, amikor egy is elég. Rövidebb is, memóriában is kevesebbet foglal. Hogy azt az egy sort közvetlenül írod be, vagy függvénybe teszed, nem lényegi kérdés."Ha már a program legvégén deklarálom a függvényt, és csak meghívom a setup blokkból, akkor nem csinálja meg. "
Ha függvény hívását később a loopba teszed, akkor megy?
Le kéne írni, hogyan deklaráltad, és hogyan hívtad, hogy valami fogalmunk legyen, hogy mi a kérdés.
Mi az, hogy nem csinálja? Lefordítja hibajelzés nélkül, csak nem hajtja végre?
Van elég várakozás az elején, hogy minden talpra álljon?
A Serial2 beginje megvolt előtte? Van utána elég várakozás?
A képernyőt nem kell inicializálni ? -
Janos250
őstag
válasz
Tomika86 #17218 üzenetére
Ha ez helyett:
Serial2.print("page 0");
Serial2.write(0xff);
Serial2.write(0xff);
Serial2.write(0xff);
ezt írod:Serial2.print("page 0\xff\xff\xff");
Akkor, ha 4 sorban írod az jó, ha egyben, akkor nem? Na, ne!
Biztos, hogy a Serial2 beginje a setup elején van, és van utána delay? Mondjuk delay(2000)?
Egyáltalán feléled akkorra a képernyő?
Van elöl elég delay, hogy minden felálljon? -
Janos250
őstag
válasz
Tankblock #17210 üzenetére
Köszi, tulajdonképpen nem a konvertálásra gondoltam, de közben megtaláltam, hogy nem szabad kitenni az x elé a 0-t.
https://en.cppreference.com/w/cpp/language/escape
Vagyis a
Serial2.print("page 0");
Serial2.write(0xff);
Serial2.write(0xff);
Serial2.write(0xff);helyett a
Serial2.print("page 0\xff\xff\xff");
a jó.
-
Janos250
őstag
Hozzáértők!
Hogy lehet a printf (vagy print) idézetében "elbujtatni" a 0xff-et? Valahogy úgy, ahogy a \n megy? A \0xff nem jó.Vagy C string konstansba tenni, és azt nyomtatni?
-
Janos250
őstag
"Ha működik, akkor nem szabad megjavítani"
Én ezt mégis fordítva szoktam követni. Amikor működik, akkor 50 %-ban van kész. Akkor kell elemeire szétszedni, és logikusan újból, optimalizálva összerakni, kommentezni, változóknak beszélő neveket adni, bekezdésekkel, szóközökkel olvashatóbbá tenni, sortörésekkel az összetartozókat blokkba szedni, stb. :-)
-
Janos250
őstag
Kösz mindenkinek! Utánanézek, nem ismerem ezt a Pihole-t :-)
-
Janos250
őstag
Találtam egy hasznos felhasználási módját az ESP-nek!
Ha a nem kívánatos SPAM jellegű "néznivalók" linkjeit windows alatt a host nevű fájlba berakja az ember egy nem létező IP címmel, akkor azt nem hozza be, de vannak oldalak, amelyek addig várakoznak, míg meg nem érkezik onnan valami. Most erre az IP-re tettem egy ESP mini WEB szervert, ami egy üres html oldalt hoz be. Azóta kellemesebb az életemNem jön az "akarsz a közeledben ingyen ....et?", és hasonló oldalak. Legfeljebb G...tyán milliárdjait nem növelem.
-
Janos250
őstag
-
Janos250
őstag
Srácok! Valahogy nem boldogulok én a lib szerkezettel.
Valakinek tasmotát kellene fordítanom, Arduino IDE alatt.
Régebben már csináltam, de most valahogy nem megy.Van a tasmota.ino file:
C:\Arduino\arduino-1.8.19\portable\sketchbook\Csikor\tasmota.inoA programban: #include <t_bearssl.h>
A neten azt írják, hogy a lib könyvtárat másoljam be a sketchbook\libraries-be. Megtettem, ott is van a file:
C:\Arduino\arduino-1.8.19\portable\sketchbook\libraries\lib_ssl\bearssl-esp8266\src\t_bearssl.hValahol meg azt írták, hogy a saját sketch-be tegyem. Oda is betettem:
C:\Arduino\arduino-1.8.19\portable\sketchbook\Csikor\tasmota\lib\lib_ssl\bearssl-esp8266\src\t_bearssl.h#include <t_bearssl.h>-nél továbbra is jön a hibajelzés:
t_bearssl.h: No such file or directoryLehetne persze az összes .h és .cpp file-t berakni a sketchhez, de annyi van belőlük, hogy a maradék hajam is kihullik, mire átpakolom.
Hogyan csináljam, hogy megtalálja?
Nem, nem akarok platformio-t használni, hanem Arduino IDE-t -
Janos250
őstag
válasz
Tomika86 #17130 üzenetére
Közben csináltam egy alternatívát az AnalogRead()-re, ami már átlagolva olvas, így kényelmesebben használható, csak be kell írni az analogRead() helyére. Ha gondolod, kipróbálhatod.
#include <iostream>
#include <queue>
using namespace std;
void setup() {
Serial.begin(115200);
delay(3000);
Serial.println();
} ; // end setup
void loop() {
printf("analogRead = %d \n",analogReadESP32WithMovingAverage(36,3) );
delay(2000);
} ; // end loop
int16_t analogReadESP32WithMovingAverage(uint8_t GPIOn, uint16_t periodLength){
const uint8_t GPIOs[] = {36, 39, 32, 33, 34, 35};
static queue<uint16_t> analogValues[6];
static uint16_t sum [6];
int8_t GPIOlistNum = -1 ;
for (int i = 0; i < 6; i++) {
if ( GPIOs[i] == GPIOn ){
GPIOlistNum = i;
break;
} ;
} ;
if ( GPIOlistNum < 0 ){
return -1 ;
} ;
while ( analogValues[GPIOlistNum].size() >= periodLength){
sum[GPIOlistNum]-=analogValues[GPIOlistNum].front() ;
analogValues[GPIOlistNum].pop() ;
} ;
uint16_t readedAnalogValue = analogRead(GPIOn) ;
sum[GPIOlistNum] += readedAnalogValue;
analogValues[GPIOlistNum].push(readedAnalogValue) ;
return sum[GPIOlistNum]/analogValues[GPIOlistNum].size() ;
}; // end analogReadESP32WithMovingAverage -
Janos250
őstag
válasz
Janos250 #17109 üzenetére
A
return szumma[csatorna]/mintakSzama ;
helyett
return szumma[csatorna]/analogErtekek[csatorna].size() ;
írandó, akkor az eleje is jó.
i= 1000 atlagertek = 1000
i= 1100 atlagertek = 1050
i= 1200 atlagertek = 1100
i= 1300 atlagertek = 1200
i= 1400 atlagertek = 1300
i= 1500 atlagertek = 1400
i= 1600 atlagertek = 1500
i= 1700 atlagertek = 1600
i= 1800 atlagertek = 1700
i= 1900 atlagertek = 1800 -
Janos250
őstag
Nem jobb.
A Tied az összes eddigi mintának az átlagát veszi, ezek meg az utolsó néhányét.
Ha mondjuk Tomika86 az autó sebességét akarja számolni némi szűréssel, akkor a mozgó átlag a jobb, de ha a teljes útra akar átlagsebességet, akkor csak a Tied a jó.
Memóriában persze annál nagyobb helyet foglal, minél magasabb szintű nyelvi dolgokat használunk. A legkevesebb memória az assembly. -
Janos250
őstag
válasz
Tomika86 #17104 üzenetére
Ez is egy lehetséges verzió:
#include <iostream>
#include <queue>
#define mintakSzama 3
#define csatornakSzama 6
using namespace std;
void setup() {
Serial.begin(115200);
delay(3000);
Serial.println();
for (uint16_t i = 1000 ; i < 2000 ; i+=100 ) {
// a 0. analog csatornara minta
uint16_t atlagertek = atlag (0,i) ;
printf("i= %d atlagertek = %d \n", i,atlagertek);
} ;
} ; // end setup
void loop() {
} ;
uint16_t atlag (uint8_t csatorna, uint16_t ertek){
static queue<uint16_t> analogErtekek[csatornakSzama];
static uint16_t szumma [csatornakSzama];
// ha static, akkor nem vesz el kilepeskor az erteke, megtartja
if ( analogErtekek[csatorna].size() == mintakSzama ){
szumma[csatorna]-=analogErtekek[csatorna].front() ;
analogErtekek[csatorna].pop() ;
} ;
szumma[csatorna] += ertek ;
analogErtekek[csatorna].push(ertek) ;
return szumma[csatorna]/mintakSzama ;
};Ezt írja ki:
i= 1000 atlagertek = 333
i= 1100 atlagertek = 700
i= 1200 atlagertek = 1100
i= 1300 atlagertek = 1200
i= 1400 atlagertek = 1300
i= 1500 atlagertek = 1400
i= 1600 atlagertek = 1500
i= 1700 atlagertek = 1600
i= 1800 atlagertek = 1700
i= 1900 atlagertek = 1800 -
Janos250
őstag
válasz
tibi-d #17055 üzenetére
Sok jelentősége nincs. ha a default pineket használod, akkor talán 1-2 ns-sel gyorsabb.
Ha nem azt használod, akkor meg teljesen mindegy, ugyanis van egy hardware mátrix - olyasmi mint a fóliás billentyűzetekben - azon keresztül megy. A mátrix egyik oldalához vannak kötve a perifáriák, a másikhoz meg a pinek, és amikor összerendeled őket, akkor egy adott sort összekötsz egy adott oszloppal.
Az analogokat a defaultból válaszd. Az UART1-nek is van default, de az nem jó, mert azt a memória kezeléshez használja, a lapok többségén ki sincs vezetve.
Én az I2C-t, és az SPI-t (VSPI) az alapértelmezetthez szoktam kötni, de csak megszokásból. Itt elég jól fel vannak tüntetve:
https://i2.wp.com/randomnerdtutorials.com/wp-content/uploads/2018/08/ESP32-DOIT-DEVKIT-V1-Board-Pinout-36-GPIOs-updated.jpg
Meg itt is:
https://i0.wp.com/randomnerdtutorials.com/wp-content/uploads/2018/08/esp32-pinout-chip-ESP-WROOM-32.pngVagy ez:
#ifndef Pins_Arduino_h
#define Pins_Arduino_h
#include <stdint.h>
#define EXTERNAL_NUM_INTERRUPTS 16
#define NUM_DIGITAL_PINS 40
#define NUM_ANALOG_INPUTS 16
#define analogInputToDigitalPin(p) (((p)<20)?(esp32_adc2gpio[(p)]):-1)
#define digitalPinToInterrupt(p) (((p)<40)?(p):-1)
#define digitalPinHasPWM(p) (p < 34)
static const uint8_t LED_BUILTIN = 2;
#define BUILTIN_LED LED_BUILTIN // backward compatibility
#define LED_BUILTIN LED_BUILTIN
static const uint8_t TX = 1;
static const uint8_t RX = 3;
static const uint8_t SDA = 21;
static const uint8_t SCL = 22;
static const uint8_t SS = 5;
static const uint8_t MOSI = 23;
static const uint8_t MISO = 19;
static const uint8_t SCK = 18;
static const uint8_t A0 = 36;
static const uint8_t A3 = 39;
static const uint8_t A4 = 32;
static const uint8_t A5 = 33;
static const uint8_t A6 = 34;
static const uint8_t A7 = 35;
static const uint8_t A10 = 4;
static const uint8_t A11 = 0;
static const uint8_t A12 = 2;
static const uint8_t A13 = 15;
static const uint8_t A14 = 13;
static const uint8_t A15 = 12;
static const uint8_t A16 = 14;
static const uint8_t A17 = 27;
static const uint8_t A18 = 25;
static const uint8_t A19 = 26;
static const uint8_t T0 = 4;
static const uint8_t T1 = 0;
static const uint8_t T2 = 2;
static const uint8_t T3 = 15;
static const uint8_t T4 = 13;
static const uint8_t T5 = 12;
static const uint8_t T6 = 14;
static const uint8_t T7 = 27;
static const uint8_t T8 = 33;
static const uint8_t T9 = 32;
static const uint8_t DAC1 = 25;
static const uint8_t DAC2 = 26;
// PWM Driver pins for PWM Driver board
static const uint8_t PWM0 = 12;
static const uint8_t PWM1 = 13;
static const uint8_t PWM2 = 14;
static const uint8_t PWM3 = 15;
static const uint8_t PWM4 = 16;
static const uint8_t PWM5 = 17;
static const uint8_t PWM6 = 18;
static const uint8_t PWM7 = 19;
#endif /* Pins_Arduino_h */Apropó!
Szerintetek ennek a sornak mi az értelme:#define LED_BUILTIN LED_BUILTIN
-
Janos250
őstag
válasz
Sebiferi #17047 üzenetére
Erre én is kíváncsi lennék, mert irreálisan alacsonyak az árak. pl. ESP32CAM 1100 Ft.
Lehet, arra játszanak, hogy nem küldik, és mivel hosszú a szállítási határidő, és az nem is a rendelés napjától, hanem attól a naptól számít, amikor ők postára adták, így aki nagyon erősködik annak visszautálják, de sokan addigra el is felejtik, és az a hasznuk. -
Janos250
őstag
Most akadtam erre a cikkre. Szerintetek van valami előnye, ha nem C++ -t , hanem C# -ot használunk? Én nem találtam, de nem sikerült teljesen átlátnom a témát.
https://csharptutorial.hu/c-kod-futtatasa-esp32-mikrovezerlon -
-
Janos250
őstag
válasz
Ton-ton #17006 üzenetére
"Sikerült találnom egy piaci rést"
Az jó, csak ha 2-3 évbe telik, mire megcsinálod, nehogy más előbb megcsinálja, és befurakodik abba a résbe.
Nekem is volt fiatal koromban, hogy amikor megtaláltam egy rést, addig szerencsétlenkedtem, míg más furakodott be abba a résbe!Egyébként, a több választható megoldás közül természetesen azt válaszd, ami neked kedvesebb, mert annak elkészítéséhez nagyobb lelkierőd lesz, és az nagyon fontos!
Hajrá, akár ilyen, akár olyan megoldással. -
Janos250
őstag
válasz
Ton-ton #17006 üzenetére
Nem erőltetem, te látod át az egészet, csak érveket mondok. Ha csuklós karral végzed, akkor is ugyanannyit kell ott tölteni. Persze biztosan vannak a robotkarra is bevált, kidolgozott, publikált megoldások, hogy hogyan lehet transzformálni X,Y,Z-ből a kar nagyjából polár koordinátaira, hiszen a robotkar már régóta alkalmazott megoldás. Ezt a részét nem ismerem, lehet, tényleg egyszerű.
-
Janos250
őstag
válasz
Ton-ton #16998 üzenetére
Ez olyasmi, mint a jelenleg is alkalmazottak közül pl. a panelokra alkatrészeket beültető robot, vagy ami pár patikában van, gyógyszert kiszedő automata.
Pár megjegyzés, de természetesen te döntesz, én csak azt mondom el, én hogyan csinálnám.
A legjobban akkor jársz, ha nem forgó mozgást végző robotkarral, hanem derékszögű rendszerrel dolgozol. Ebben az esetben az ortogonális (az egyik megváltozása nem vonja maga után a másik változását) adatok kezelése sokkal könnyebb.
Elkészítesz megfelelő méretben egy 3D nyomtatóhoz hasonló, le-föl mozgó keretet, és arra csukló-nyagló kar helyett egy ilyen szisztémájú, derékszögben mozgó kart:
https://www.banggood.com/New-NEJE-Master-2S-30W-Powerful-Laser-Engraver-and-Cutter-2-In-1-Adjustable-Variable-Focus-Lens-and-Fixed-Focal-Laser-Support-Wireless-APP-Operation-or-32-bit-MCU-Banggood-Exclusive-World-Premiere-p-1778874.html
A keret megfelelő magasságra emelkedik, az X tengelyen a kar megfelelő X pozícióba áll, majd az Y kar benyúl a megfelelő helyre. Persze a kar végén nem egy lézer fej van, hanem egy Z irányban mozgó újabb kar, a végén a csőrrel, ami megfogja pl. a gyógyszeres dobozt, felemeli, és onnantól kezdve már mehet vissza, és a megfelelő, helyre lerakja, leejti, attól függ, hogy ez csak gyűjtés, vagy beillesztés. A csőrt Z irányban mozgató kar akár el is hagyható, a keret mozgatásával kiváltható.
Ez esetben a PI végzi a számításokat, a GRBL adatok generálását, a RAMP-on lévő Mega a saját (Arduino, vagy egyéb) programjával a kapott GRBL adatok alapján vezérli a léptetőmotorokat.CAD céljára én a Fusion 360-ot használom, mert annak van ingyenes verziója, bár azt csak magán célra szabad használni. Minden relatív benne, korábbi síkokhoz képest, a maga előnyeivel és hátrányaival.
-
Janos250
őstag
Megjöttek a JLCPCB paneljaim.
Kétféle, 2 * 5 db.
Gyártás 6 $, szállítás 16 $. összesen 22 $.
Még így is sokkal olcsóbb, mint itthon.
Viszont a története elég érdekes.
18-án hajnalban megérkezett a rendelés, délben elkezdték gyártani, 20-án reggel postára adták.
SHENZHEN - HONG KONG - BANGKOK, majd 23-án reggel megérkezett Frankfurtba, majd délután Lipcsébe.
Febr. 1-én sikerült is hatalmas gyorsasággal levámolni, és már küldték is tovább Kölnbe, onnan 2-án tovább Düsseldorfba, majd még aznap a DHL-hez, ott kapott egy új nyomkövetési számot, és még aznap átment Bochumba, majd 3-án Feuchtba. 4-én megérkezett kicsiny hazánkba, ma, 7-én kihozta a Magyar posta.
Korábban azért ez egyszerűbb volt! -
Janos250
őstag
Nem ismertem, megnéztem, de én a másikban jobban bíznék. Azt írja, a micro stepet is megoldja, azt nem tudom, hogy PWM-mel. Továbbá a másikakból az újabbnak van olyan előnye, hogy nem ránt rajta akkorát sem induláskor, sem megálláskor. Ez nem csak a hangját csökkenti drasztikusan, de a kar sem rángatódzik annyira, bár nem vagyok szakértő, csak amiket korábban olvasgattam.
-
Janos250
őstag
válasz
Ton-ton #16973 üzenetére
A Ramp az jó, bár Megaval megy, de nem tudok olyan, nagy szériában gyártott panelről, ami korszerűbb procival (STM, ESP) megy. Utólag szokták hozzá mókolni az ESP8266-ot, akinek kell.
A programodat hova akarod tenni? A RAMP Megájába? Vagy külön panel lesz rá?
USB ügyben elég gyenge vagyok.
"Esetleg tudnál compilert javasolni?"
Ha az Arduino IDE-t letöltöd, abban minden benne van, szőrötül-bőröstül.
Megnyomot a feltöltés menüt, és mindent elintéz.
Van olyan IDE, ami régebbi fordítót tartalmaz, de pl. az ESP32-höz ami van, az már tudja a C++11-et, bár az alapesetben nem szükséges. -
Janos250
őstag
válasz
Ton-ton #16971 üzenetére
"Az arduino vezérelné a léptetőmotorokat (robotkar)"
Valamelyik korszerűbb Arduionot használd! Korszerű léptetőmotor vezérlő IC-vel! Pl. TMC 21xx, 22xx. Ne akarj vérd izzadni a nem elég korszerú eszközökkel.Minek ennyi USB? (WiFi, BT nem jó? nem törik el a madzag, nem fékez.)
"Egyáltalán jó helyen járok, vagy máshol kérdezzek?"
A PI részét itt szerintem kevesen értik, de az Arduinoban páran jól benne vannak.
"Programozás szempontjából mi lenne az ideális?"
Az Arduinot C++ nyelven programozzuk, ez biztosan ingyenes marad, jó fordítóval egyetemben.
Ez megy PI-n is.
Ha PHP-t használtál, akkor a C++ 1-2 óra tanulás, mert a PHP az tulajdonképpen C++ kiegészítés. (Na, jó, nem teljesen, de majdnem). -
Janos250
őstag
válasz
sisi22 #16959 üzenetére
Ha nem üzemszerű működésre kell, akár a Serial monitoron is ki lehet íratni.
Például:uint8_t kapcsoloPin = 5;
uint8_t kapcsolo ;
uint32_t kezdo_millis ;
uint32_t veg_millis ;
void setup() {
Serial.begin(115200);
delay(2000) ;
pinMode(kapcsoloPin, INPUT_PULLUP);
} ; // end setup
void loop() {
while(digitalRead(kapcsoloPin)) {} ;
kezdo_millis = millis();
delay(10); // prell mentesites, de hw kell
while(!digitalRead(kapcsoloPin)) {} ;
veg_millis = millis();
delay(10); // prell mentesites
Serial.print("kezdo_millis = "); Serial.print(kezdo_millis);
Serial.print(" veg_millis = "); Serial.print(veg_millis);
Serial.print(" idotartam_millis = "); Serial.print(veg_millis-kezdo_millis);
Serial.println();
} ; // end loopEzt írta ki:
kezdo_millis = 8069 veg_millis = 10698 idotartam_millis = 2629
kezdo_millis = 13376 veg_millis = 15973 idotartam_millis = 2597
kezdo_millis = 16130 veg_millis = 18695 idotartam_millis = 2565
kezdo_millis = 19155 veg_millis = 20738 idotartam_millis = 1583
kezdo_millis = 21394 veg_millis = 22556 idotartam_millis = 1162
kezdo_millis = 22994 veg_millis = 24997 idotartam_millis = 2003
kezdo_millis = 25233 veg_millis = 26612 idotartam_millis = 1379A prell (pergés) mentesítés delay()-el is megoldható, ha nagyon jó a kattanós kapcsoló, de a hw prell mentesítés a jobb, (kondi+ellenállás), már párszor volt itt rá példa.
Ha elegánsabb kell, akkor lehet gondolkodni milyen kijelzés legyen
-
Janos250
őstag
Német barátaink elég sokat tököltek Lipcsében a JLCPCB-s panelommal.
A lényeg kigyűjtve:
2022-02-01 01:35:00 Customs status updated
2022-01-31 17:23:49 Customs status updated
2022-01-27 21:32:03 Customs status updated
2022-01-25 19:47:41 Customs status updated
2022-01-24 14:34:38 Customs status updated
2022-01-23 19:28:48 Customs status updated
2022-01-23 03:38:57 Customs status updated
2022-01-20 18:35:34 Customs status updatedEnnyit kínlódni egy vámolással! Ennyiszer kérni új adatokat, igazolást a feladótól, ez már csak szívatás!
Most Lipcséből megérkezett Kölnbe, remélem, idővel Magyarország felé veszi az irányt! -
Janos250
őstag
A Bangood is átállt a magyarításra:
"Szállítás: Ft150 nak nek Hungary keresztül Banggood Express" -
Janos250
őstag
Megszívatott ez az Easyeda.
Kedveskedni akart nekem, és átállt magától magyar nyelvre, gondolom a Google fordítás segítségével. Kínlódtam, de se visszaállni nem tudtam angolra, se a "magyar" megfelelőkkel használni.
Az új alkatrész felrakása a tervrajza : Place component. Ez így érthető.
"Magyar" menüben: helyösszetevő.
Végül sikerült visszaállnom angolra. -
Janos250
őstag
Hogy a franc megenné ezt az új szállítási rendszert. A panelomat hiába csinálta meg a JLCPCB egy nap alatt, ha január 23 óta Lipcsében várja jobb sorsát!
-
Janos250
őstag
válasz
tonermagus #16927 üzenetére
Ugyanaz!
-
Janos250
őstag
válasz
tonermagus #16922 üzenetére
Korábban Weiss ajánlotta neked az IRLZ44N-et. Én akkor mértem, kissé elmaradnak a paraméterei az általam használt IRLB4030-tól, de nem sokban. Szerintem próbáld ki!
https://prohardver.hu/tema/arduino/hsz_15562-15562.htmlOK, így stimmel, szerintem.
-
Janos250
őstag
válasz
tonermagus #16922 üzenetére
Nem hiányzik, hanem sok!
A felső GND a D-nél törlendő. Én nem szoktam tovább cicomázni, én így szoktam használni.
"ebből a mondatból nem sok mindent értek"
Ha logikai szinttel, és nem analóg hajtod meg, akkor az vagy magas, vagy alacsony szint a Gate-en, ebből adódóan a FET mindig vagy nyitott (vezet, mint egy drót) vagy zárt (nem vezet, mint egy elvágott drót) állapotban van, és mivel a FET melegedése (disszipáció) a rajta lévő feszültség * áramerősség , egyik esetben az áramerősség, másikban a D és S közötti feszültség közel nulla, ezért a melegedés sem számottevő.
-
Janos250
őstag
válasz
tonermagus #16912 üzenetére
Ha 5V-os is lehetne, akkor WS2812. Sokkal kényelmesebb. Kiküldöd neki a három szín fényerejét, és ő megjegyzi, csak akkor kell újra küldeni, ha változik. Mellesleg 3.3V-ról is elmegy, csak kisebb lesz a fényerő. (Igen, kipróbáltam)
-
Janos250
őstag
válasz
tonermagus #16908 üzenetére
Én ajánlani már semmit senkinek nem ajánlok, csak azt mondom el, én hogyan csinálom/csinálnám.
Én az IRLB4030-at használom, ez nagyon jól bevált, kivétel, amikor az Aliról használhatatlan példányokat kaptam.
Gyakorlatilag tökéletesen nyit, zár, nem melegszik, nagyon kicsi az ellenállása az ESP32 kimenetével hajtva a gate-et.
A vásárolt példányoknak kb. a fele rossz volt, nem nyitott ki teljesen, és nagyon melegedett.
Amit megbízhatóbb eladótól vettem az mind jó, de volt 2 olyan rendelésem is, hogy mind rossz volt. Kénytelen voltam az összes példányt lemérni, és a rosszakat kidobni.
Részlet, hogy én hogyan használom: (Csak a FET-eket és az ESP32-t nézd, mert van ami el van rontva, de nem találom a javítottat) -
Janos250
őstag
válasz
Undoroid #16899 üzenetére
Például egy lehetséges megoldás:
void color (unsigned char red, unsigned char green, unsigned char blue,
int redPin, int greenPin, int bluePin);
{
analogWrite(redPin, 255-red); // PWM signal output
analogWrite(greenPin, 255-green); // PWM signal output
analogWrite(bluePin, 255-blue); // PWM signal output
} ;hívás:
color(255,255,0,11,10,9);
color(255,255,0,6,5,3);
stb. -
Janos250
őstag
válasz
JozsBiker #16879 üzenetére
Az ESP32-nek van saját time.h-ja, az jól működik, ahogy weiss is írta.
Itt jobban kirészletezve:
https://lastminuteengineers.com/esp32-ntp-server-date-time-tutorial/Vagy maga a program:
#include <WiFi.h>
#include "time.h"
const char* ssid = "xxxxx";
const char* password = "xxxxxxxx";
const char* ntpServer = "pool.ntp.org";
const long gmtOffset_sec = 3600;
const int daylightOffset_sec = 3600;
void printLocalTime()
{
struct tm timeinfo;
if(!getLocalTime(&timeinfo)){
Serial.println("Failed to obtain time");
return;
}
Serial.println(&timeinfo, "%A, %B %d %Y %H:%M:%S");
}
void setup()
{
Serial.begin(115200);
//connect to WiFi
Serial.printf("Connecting to %s ", ssid);
WiFi.begin(ssid, password);
while (WiFi.status() != WL_CONNECTED) {
delay(500);
Serial.print(".");
}
Serial.println(" CONNECTED");
//init and get the time
configTime(gmtOffset_sec, daylightOffset_sec, ntpServer);
printLocalTime();
}
void loop()
{
delay(1000);
printLocalTime();
} -
Janos250
őstag
válasz
tonermagus #16885 üzenetére
Itt írnak róla, én még nem próbáltam.
Vagy Google arduino autobaudhttps://forum.arduino.cc/t/auto-serial-baudrate-detector-selector/38256
-
Janos250
őstag
-
Janos250
őstag
válasz
Dißnäëß #16806 üzenetére
Én Gyapo11 által is írt módszert használnám. Faék!
https://prohardver.hu/tema/arduino/hsz_15165-15165.html -
Janos250
őstag
Valahogy nem értem én ezeknek a könyvtáraknak a logikáját.
Most SHA1 és base64 ami kell nekem, de mindkettőből tele van a padlás különböző verziókkal.
Pl. SHA-ból ezt#include <C:\Arduino\arduino-1.8.19\portable\packages\esp32\hardware\esp32\1.0.6\tools\sdk\include\esp32\hwcrypto\sha.h>
akarom használni, mert az hw.
Ha így beírom a teljes utat, meg is találja, és azt találja meg, ami nekem kell, de hogy írjam be, hogy más környezetben is megtalálja, ha máshova teszem az Arduinot, vagy ha pl. nem portable?
Base64-ből is rengeteg van.#include <base64.h>
hatására talál egyet, ami jó eredményt is ad, de honnan tudom, hogy ez éppen a sok közül melyik base64.h-t, és base64.cpp-t használja? -
Janos250
őstag
válasz
Dißnäëß #16768 üzenetére
Én régen fűrészeltem, mostanában éles csípővel vágom, de akkor egy pin kárba vész.
Visszanéztem: én 2.22 $-ért vettem a csípőt ingyen szállítással 2020.11.11-kor, ma 2500 Ft, + 1500 szállítás. Őrület.
https://www.banggood.com/DANIU-Electrical-Cutting-Plier-Wire-Cable-Cutter-Side-Snips-Flush-Pliers-Tool-p-1046482.html?cur_warehouse=CN -
Janos250
őstag
válasz
Dißnäëß #16762 üzenetére
Én ezt vettem:
https://www.banggood.com/50pcs-40Pin-2_54mm-Female-Header-Connector-Socket-For-DIY-p-945515.html?cur_warehouse=CN
Mivel 50 darabos tételt vettem, még az ükunokáim is ezt fogják használni, de így 100 Ft körül volt darabja. Két héten belül hozta a futár, semmi extra költség, adminisztráció, vagy mászkálás.
Nem ajánlat, csak elmondom, hogy én ezt vettem, és ezeket használom. -
Janos250
őstag
Közben megtaláltam. Szabályos.
https://www.w3schools.com/tags/att_a_type.asp -
Janos250
őstag
Validátor ezt elfogadja, a text fájlt így már nem is próbáltam, mert azt úgy biztosan nem fogadja el, de nem is biztos, hogy kell.
Lehet, hogy így kellene?
Annyira fű vagyok a WEB programozáshoz.<link rel="stylesheet" type="text/css" href="theme.css">
https://www.w3schools.com/tags/att_href.asp -
-
Janos250
őstag
Eredetileg egy .ino.txt volt, de azt is ugyanúgy kifogásolta, pedig hát egy .txt fájlt csak jó lenne, ha megjelenítene különösebb fakszni nélkül. Nem lehet egyszerű módszerrel megjeleníteni egy txt fájlt?
Ha elé rakok fejlécet, akkor meg a #include-ot kifogásolja.
Nem szeretnék bonyolultabb megoldást, ha végképp nem megy, átteszem .pdf-be, mert az nem zavarja, azt simán kiírja. Én úgy képzelném, hogy csak van valami hasonlóan egyszerű megoldás, csak én nem tudom.
Új hozzászólás Aktív témák
- Villanyszerelés
- Samsung Galaxy S24 FE - később
- Milyen videókártyát?
- Allegro vélemények - tapasztalatok
- Xiaomi 13 - felnőni nehéz
- Győr és környéke adok-veszek-beszélgetek
- Milyen autót vegyek?
- HiFi műszaki szemmel - sztereó hangrendszerek
- Milyen TV-t vegyek?
- AMD Ryzen 9 / 7 / 5 9***(X) "Zen 5" (AM5)
- További aktív témák...
- Bontatlan Apple 96W USB C hálózati adapter (töltő) eladó
- 16GB RAM 1TB Háttér 10,1" NoName
- Chuwi HiPad Pro 8GB/128GB 10.8" 2K 8mag 2SIM Alu ház 7,5mm 450g
- BONTATLAN STEELSERIES TERMÉKEK BOMBA ÁRON! ÚJ, AZONNAL ÁTVEHETŐ!
- ASUS ROG Strix Scar 16 G634JZR i9-14900HX, 32GB DDR5, RTX 4080 (2027.08-ig garis)
- Lenovo ThinkPad dokkolók: USB-C 40A9/ 40AY/ 40AS/ Thunderbolt 3 40AC/ Hybrid USB-C DisplayLink 40AF
- Samsung Galaxy S23 , 8/128 GB , Kártyafüggetlen
- ÁRGARANCIA!Épített KomPhone i5 10600KF 16/32/64GB RAM RX 6600 8GB GAMER PC termékbeszámítással
- Bomba ár! HP Elitebook 8570W - i7-QM I 16GB I 750GB I 15,6" HD+/FHD I Nvidia I W10 I Garancia
- Bomba ár! Dell Latitude E6530 - i5-3GEN I 4GB I 500GB I HDMI I 15,6" HD+ I W10 I Garancia!
Állásajánlatok
Cég: PCMENTOR SZERVIZ KFT.
Város: Budapest
Cég: Promenade Publishing House Kft.
Város: Budapest