- NVIDIA GeForce RTX 5070 / 5070 Ti (GB205 / 203)
- SD-kártyát vennél? Ezért ne csak a GB-ot nézd! – Tech Percek #9
- Fejhallgató erősítő és DAC topik
- ASUS notebook topic
- Melyik tápegységet vegyem?
- Milyen SSD-t vegyek?
- Azonnali alaplapos kérdések órája
- ASUS blog: Ideális olcsó utazós gép lett az új Vivobook S14
- AMD K6-III, és minden ami RETRO - Oldschool tuning
- Radeon RX 9060 XT: Ezt aztán jól meghúzták
-
PROHARDVER!
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
-
Tomika86
senior tag
// Fordulatszám méréshez
const int hallPin = 2; // pin 2 = int 0
volatile unsigned long cntTime = 0;
volatile unsigned long cnt = 0;
volatile unsigned long rpm = 0;
unsigned long readings[numReadings];
unsigned long readIndex;
unsigned long total;
unsigned long average;
const byte numReadings = 2;
unsigned long measureTime = 0, curTime, startTime = 0;
int dispCnt = 0, measureCnt = 0;
const int resetTime = 2000;
const int minRotNum = 1; // 1 - calc after every rotation
void loop()
{
curTime = millis();
if ( curTime - cntTime > resetTime) // reset when less than 30RPM (dt>2s)
{
cnt = measureCnt = 0;
rpm = 0;
}
if (cnt == 1) startTime = cntTime;
if (cnt - measureCnt >= minRotNum) {
rpm = 60000L * (cnt - measureCnt) / (cntTime - measureTime);
measureCnt = cnt;
measureTime = cntTime;
}
// Smoothing RPM:
total = total - readings[readIndex];
readings[readIndex] = rpm;
total = total + readings[readIndex];
readIndex = readIndex + 1;
if (readIndex >= numReadings)
{
readIndex = 0;
}
average = total / numReadings;
}
void doCount()
{
cnt++;
cntTime = millis();
} -
Tomika86
senior tag
Ehhez [link]pedig ezt a részét használtam fel:
// Smoothing RPM:
total = total - readings[readIndex]; // Advance to the next position in the array.
readings[readIndex] = RPM; // Takes the value that we are going to smooth.
total = total + readings[readIndex]; // Add the reading to the total.
readIndex = readIndex + 1; // Advance to the next position in the array.
if (readIndex >= numReadings) // If we're at the end of the array:
{
readIndex = 0; // Reset array index.
}
average = total / numReadings; // The average value it's the smoothed result.RPM a bemeneti nyers fordulat. average a kimeneti megjelenített, de ugrál a mutató
Egyébként pontos, Frekvencia * 60 jelenik meg mindkettő esetében -
Tomika86
senior tag
Ez a bonyolultabb mérés, ez a hirtelen változásokra van hogy lemegy 0-ra is, meg összevissza ugrál ilyenkor:
const byte PulsesPerRevolution = 2;
const unsigned long ZeroTimeout = 100000; // For high response time, a good value would be 100000.
// For reading very low RPM, a good value would be 300000.
// Calibration for smoothing RPM:
const byte numReadings = 2; // Number of samples for smoothing. The higher, the more smoothing, but it's going to
// react slower to changes. 1 = no smoothing. Default: 2.
/////////////
// Variables:
/////////////
volatile unsigned long LastTimeWeMeasured; // Stores the last time we measured a pulse so we can calculate the period.
volatile unsigned long PeriodBetweenPulses = ZeroTimeout+1000; // Stores the period between pulses in microseconds.
// It has a big number so it doesn't start with 0 which would be interpreted as a high frequency.
volatile unsigned long PeriodAverage = ZeroTimeout+1000; // Stores the period between pulses in microseconds in total, if we are taking multiple pulses.
// It has a big number so it doesn't start with 0 which would be interpreted as a high frequency.
unsigned long FrequencyRaw; // Calculated frequency, based on the period. This has a lot of extra decimals without the decimal point.
unsigned long FrequencyReal; // Frequency without decimals.
unsigned long RPM; // Raw RPM without any processing.
unsigned int PulseCounter = 1; // Counts the amount of pulse readings we took so we can average multiple pulses before calculating the period.
unsigned long PeriodSum; // Stores the summation of all the periods to do the average.
unsigned long LastTimeCycleMeasure = LastTimeWeMeasured;
unsigned long CurrentMicros = micros();
unsigned int AmountOfReadings = 1;
unsigned int ZeroDebouncingExtra; // Stores the extra value added to the ZeroTimeout to debounce it.
// The ZeroTimeout needs debouncing so when the value is close to the threshold it
// doesn't jump from 0 to the value. This extra value changes the threshold a little
// when we show a 0.
// Variables for smoothing tachometer:
unsigned long readings[numReadings]; // The input.
unsigned long readIndex; // The index of the current reading.
unsigned long total; // The running total.
unsigned long average; // The RPM value after applying the smoothing.
void setup() // Start of setup:
{
Serial.begin(9600); // Begin serial communication.
attachInterrupt(digitalPinToInterrupt(2), Pulse_Event, RISING); // Enable interruption pin 2 when going from LOW to HIGH.
delay(1000); // We sometimes take several readings of the period to average. Since we don't have any readings
// stored we need a high enough value in micros() so if divided is not going to give negative values.
// The delay allows the micros() to be high enough for the first few cycles.
} // End of setup.
void loop() // Start of loop:
{
LastTimeCycleMeasure = LastTimeWeMeasured; // Store the LastTimeWeMeasured in a variable.
CurrentMicros = micros();
if(CurrentMicros < LastTimeCycleMeasure)
{
LastTimeCycleMeasure = CurrentMicros;
}
// Calculate the frequency:
FrequencyRaw = 10000000000 / PeriodAverage; // Calculate the frequency using the period between pulses.
// Detect if pulses stopped or frequency is too low, so we can show 0 Frequency:
if(PeriodBetweenPulses > ZeroTimeout - ZeroDebouncingExtra || CurrentMicros - LastTimeCycleMeasure > ZeroTimeout - ZeroDebouncingExtra)
{ // If the pulses are too far apart that we reached the timeout for zero:
FrequencyRaw = 0; // Set frequency as 0.
ZeroDebouncingExtra = 2000; // Change the threshold a little so it doesn't bounce.
}
else
{
ZeroDebouncingExtra = 0; // Reset the threshold to the normal value so it doesn't bounce.
}
FrequencyReal = FrequencyRaw / 10000; // Get frequency without decimals. This is not used to calculate RPM but we remove the decimals just in case you want to print it.
// Calculate the RPM:
RPM = FrequencyRaw / PulsesPerRevolution * 60; // Frequency divided by amount of pulses per revolution multiply by 60 seconds to get minutes.
RPM = RPM / 10000; // Remove the decimals.
// Smoothing RPM:
total = total - readings[readIndex]; // Advance to the next position in the array.
readings[readIndex] = RPM; // Takes the value that we are going to smooth.
total = total + readings[readIndex]; // Add the reading to the total.
readIndex = readIndex + 1; // Advance to the next position in the array.
if (readIndex >= numReadings) // If we're at the end of the array:
{
readIndex = 0; // Reset array index.
}
average = total / numReadings; // The average value it's the smoothed result.
Serial.print("\nRPM: ");
Serial.print(RPM);
Serial.print("\tTachometer: ");
Serial.println(average);
}
void Pulse_Event() // The interrupt runs this to calculate the period between pulses:
{
PeriodBetweenPulses = micros() - LastTimeWeMeasured; // Current "micros" minus the old "micros" when the last pulse happens.
// This will result with the period (microseconds) between both pulses.
// The way is made, the overflow of the "micros" is not going to cause any issue.
LastTimeWeMeasured = micros(); // Stores the current micros so the next time we have a pulse we would have something to compare with.
if(PulseCounter >= AmountOfReadings) // If counter for amount of readings reach the set limit:
{
PeriodAverage = PeriodSum / AmountOfReadings; // Calculate the final period dividing the sum of all readings by the
// amount of readings to get the average.
PulseCounter = 1; // Reset the counter to start over. The reset value is 1 because its the minimum setting allowed (1 reading).
PeriodSum = PeriodBetweenPulses;
// Remap period to the amount of readings:
int RemapedAmountOfReadings = map(PeriodBetweenPulses, 40000, 5000, 1, 10); // Remap the period range to the reading range.
// 1st value is what are we going to remap. In this case is the PeriodBetweenPulses.
// 2nd value is the period value when we are going to have only 1 reading. The higher it is, the lower RPM has to be to reach 1 reading.
// 3rd value is the period value when we are going to have 10 readings. The higher it is, the lower RPM has to be to reach 10 readings.
// 4th and 5th values are the amount of readings range.
RemapedAmountOfReadings = constrain(RemapedAmountOfReadings, 1, 10); // Constrain the value so it doesn't go below or above the limits.
AmountOfReadings = RemapedAmountOfReadings; // Set amount of readings as the remaped value.
}
else
{
PulseCounter++; // Increase the counter for amount of readings by 1.
PeriodSum = PeriodSum + PeriodBetweenPulses; // Add the periods so later we can average.
}
} -
Tomika86
senior tag
Sziasztok!
Fordulatszám méréshez egy Unora csináltam négyszögjelgenerátort. Analóg potival a frekvencia állítható, ami működik is.
Mennyire lehet valósidejű a poti tekerésére ez? Szkóp hiányában nem tudom megnézni.#include <PWM.h>
const int kimenet_pin = 9;
const int POT_pin = A2;
int32_t frekvencia; // frekvencia értéke
void setup()
{
pinMode(POT_pin, INPUT);
pinMode(kimenet_pin, OUTPUT);
InitTimersSafe();
}
void loop()
{
int temp_frekvencia = analogRead(POT_pin); // Analóg bemenet olvasása
frekvencia = map(temp_frekvencia, 0, 1024, 1, 100);
frekvencia = constrain(frekvencia, 1, 100);
pwmWriteHR(kimenet_pin, 32768); // Kitöltési tényező 50% -> for 16-bit 65536/2 = 32768
SetPinFrequencySafe(kimenet_pin, frekvencia);
delay(500);
}Ezzel le tudtam tesztelni a fordulatszámlálós programkódot a Mega panelen, de simítással és átlagolással is ugrál a mutató, illetve van hogy beugrik 0-ra is, ha tekerem az uno potiját.
-
Istv@n
aktív tag
Sziasztok!
ESP32 boardon szeretnék eepromba írni egy tömbből, de csak akkor ha a az adott indexen lévő értékek nem azonosak.
A megvalósítást a következőképpen gondoltam:for (int i = 0; i <= 127; i++) {
if ( EEPROM.read(i) != t[i]) {
EEPROM.write(i, t[i]);
delay(20);
Serial.print("EEprom iras: ");
Serial.println(i);
}
}
EEPROM.commit();A helyzet az, hogy a for ciklus nem áll meg 127 után, hanem megy a végtelenségig....
Miért lehet ez?
Boot után, egy hasonló ciklussal íratom ki az eeprom értékeket a soros portra, és az rendben működik.... -
Janos250
őstag
válasz
tonermagus #15589 üzenetére
"bocsi a sok kérdésért, de még mindig van pár fekete folt"
Ezek a kitárgyalások itt megmaradnak, hasznát veheti még más is a jövőben, ha rákeres."folyamatosan futni fog végtelen ciklusban"
Ha végtelen ciklusba teszed, igen.
Itt egy részlet az egyik programból:
setup-ban:xTaskCreate(
readTempr,
"homersekletOlvas",
5000,
NULL,
6,
&homeroTaskHandle
);A függvény a prg végén:
void readTempr ( void* parameter) {
while (1){ // ez a vegtelen ciklus
forraloHomerseklet = readVSPI_MAX6675(CSpinForralo) ;
printf("forralo homerseklet(baloldali)= %d \n ",forraloHomerseklet);
kolonnaHomerseklet = readVSPI_MAX6675(CSpinKolonna) ;
printf("kolonna homerseklet(jobboldali)= %d \n ",kolonnaHomerseklet);
vTaskDelay(2000);
} ;
vTaskDelete(NULL); // hogy szebb legyen, de ide soha nem er el :-)
} ; // end readTempr"így is van."
Igen, így van
"Mennyire egyszerű ez a webes felületen értékátadás változóba dolog?"
Tök egyszerű.
"Egyáltalán lekapcsolható-e a wifi?"
Na, ezt nem tudom, még soha nem próbáltam, mert nekem nem volt ilyen gondom.
"ugráltak is a PWM értékek. Ez gondolom itt is simán előfordul."
Nem, mert független hardware kezeli.
https://www.electronicshub.org/esp32-pwm-tutorial/
https://circuitdigest.com/microcontroller-projects/esp32-pwm-tutorial-controlling-brightness-of-led
Az ne zavarjon meg, hogy mindenütt LED-re hivatkozik, lehet bármi, természetesen.
De ha ez nem elég, van még 8 RMT csatorna is, ami erre IS használható.Van 3 hardwareserial rajta, ebből célszerű a Serial1 és a Serial2 használata, mert a sima Serial a feltöltés, debug, stb,
de szükség esetén ez is használható.
Vannak hozzájuk előre definiált pinek, ha nem adsz meg mást, azt használja.
A Tx1, Rx1 lábát át kell definiálni, mert az alapértelmezett lábakat a memóriakezelésre használja.
A HardwareSerial.cpp fájlból:HardwareSerial Serial(0);
HardwareSerial Serial1(1);
HardwareSerial Serial2(2); -
tonermagus
aktív tag
válasz
Janos250 #15587 üzenetére
Nagyon szépen köszönöm a részletes kifejtést.
Ez az egész ESP32, dual core-os dolog nekem teljesen új még, szóval bocsi a sok kérdésért, de még mindig van pár fekete folt:- Ha a setupban létrehozok egy taskot amit a core0-án futtatok, akkor az folyamatosan futni fog végtelen ciklusban? Nem kell többet meghívnom? Mert ebben az esetben a GPS kezelésére teljesen jó lenne. Csak a Core0 írná a változókat (fix.latitude, fix.longtitude, bearing, heading, stb...) a loopban pedig a Core1-el csak olvasnám ezeket. Csak egy darab taskom lenne, az egész programban, az is Core0-ra, és csak GPS-t csinálna végig. Ez így nagyon jól hangzik, bízom benne hogy így is van.
- A PWM-es hardveres dolgot hogy érted? Nekem ahogy írtam az volt a gond az arduval, hogy olvasgattam a PWM-ket, néha bejött egy megszakítás és már ugráltak is a PWM értékek. Ez gondolom itt is simán előfordul. Igazából 5-6 PWM portot kezelnék, illetve 2 hadwares Serial porton kommunikálnék. Bízom benne hogy ezt is szépen lekezeli az ESP32
- Wifi megszakítás: olyanon agyalok hogy tennék bele programozói módot, amikor is a webszerver élne, egy felületen átadnék neki pár változót induláskor, és ezután megy tovább a program és lekapcsolja a wifit. Létezik ilyen? Mennyire egyszerű ez a webes felületen értékátadás változóba dolog? Egyáltalán lekapcsolható-e a wifi? -
Janos250
őstag
válasz
Janos46 #15583 üzenetére
Általában driver probléma a windowsban.
Nézd meg, létrejön-e egy új COM port, amikor rádugod a lapot az USB-re.
Ha igen, csak a WiFire nem csatlakozik, akkor név, jelszó probléma, vagy tartomány probléma.
Gyakori, hogy a routerek egy része a 192.168.1 , más része a 192.168.0 tartományt használja. -
Janos250
őstag
válasz
tonermagus #15585 üzenetére
"Kicsit utánaolvasgattam"
Jó helyen olvastál. :-)
"Tehát az megoldható hogy a setupban létrehozok...."
Igen, így csináljuk.
Alapból a WiFi a core0-n fut, a loop pedig a core1-en.
Ezért én a core0-ra olyasmiket szoktam rakni, aminél nem baj, ha bejön egy WiFi megszakítás, mert én általában használom a WiFit is.
Ha van time kritikus alkalmazás, azt a loopba teszem, és a core1-re akkor nem teszek másik taskot. Ez persze nem gyakori, mert a PWM-et meg hasonlókat a hardware kezeli, nem kell vele foglalkozni, hogyan csinálja.
Ezek egymástól függetlenül párhuzamosan futnak egymás mellett.
Változó: amit Weiss válaszolt. Én olyanokat szoktam használni, hogy - ha lehet - csak egyik task írja, a többi csak olvassa."A programnyelv nagyban különbözik? Arduino IDE működik?"
Mivel az Arduinonak nincs saját programnyelve, a C++ -t használja, így mindkettőnél ugyanaz.
Az ESP32 a C++2011-et használja, ebben már vannak olyan dolgok is, ami a C++ korábbi verzióiban nincs benne, így azokat is használhatod.
A stringről egy mondat: A C++ a "string" csupa kisbetűvel típust használja, de az arduinoba beletettek egy String (nagy kezdőbetűs) stringet is. Ha pl. paraméter a string, akkor nem lehet keverni. Én általában a kisbetűset használom, de van, hogy kell a String is.
Az átjárást a kettő között a C stílusú string, vagyis a karaktertömb jelenti.
Az Arduino IDE ugyanúgy működik, mint bármelyik másik lapnál.
"összevesztek a timereken."
Az ESP32 perifériái általában "saját hardware timert" használnak.
"Vagy ezt nem így kell elképzelni"
De, jól mondod. -
válasz
tonermagus #15585 üzenetére
Akármennyi taskot csinálhatsz, amíg nem futsz ki az erőforrásokból, OS schedulálja őket.
A másik kérdés: ha a TASK1-ben egy változónak értéket adok, akkor azt a loopban is használhatom?
Ha globál változó, akkor igen, de ha mindekettőből akarod írni, akkor mutexelni kell.
-
tonermagus
aktív tag
válasz
Janos250 #15578 üzenetére
Kicsit utánaolvasgattam.
Tehát az megoldható hogy a setupban létrehozok axTaskCreatePinnedToCore
-al egy TASK1-et, azt hozzárendelem a Core0-hoz, és a void TASK1() az egy végtelen loop lesz amiben csak a GPS cuccai vannak?
Illetve folytatom a programont a sima loop-al, mert az amúgy is a Core1-el megy?
Tehát kaptam egy TASK1-et ami Core0-át, illetve egy loop-ot ami Core1-et használ és párhuzamosan futnak egymás mellett?
A másik kérdés: ha a TASK1-ben egy változónak értéket adok, akkor azt a loopban is használhatom? -
tonermagus
aktív tag
válasz
Janos250 #15578 üzenetére
Igazából az ESP32-re átállás sem kizárt. Ezek szerint azzal lehet jobban járnék.
A programnyelv nagyban különbözik? Arduino IDE működik?Nekem igazából a legnagyobb problémám az egész projekt alatt az volt, a Library-k összevesztek a timereken. PWM-et olvastam, majd egy library beleszólt és az 1500-as PWM érték egyből 1765 lett. Sikerült egy másik library-t találnom, ami másik timeren használja a szervókat, de az kifejezetten Arudinohoz lett megírva. ESP32-vel beleeshetek ugyan ebbe a hibába? vagy az okosabban kezeli a timereket/interrupotokat?
Szerk: aprobó két mag... Azzal az is megoldható hogy 1 mag csak a GPS-el foglalkozik, a másik mag pedig minden mással? Az elég jól hangzik... Vagy ezt nem így kell elképzelni: Egyik szál gyakorlatilag egy loop amiben csak a GPS NMEA sorainak összeállítása a feladata, majd a fixálás elvégzése, a másik szál pedig olvassa/írja a PWM értékeket, stb... -
Janos46
tag
Sziasztok.
Immár itthonról próbálom folytatni az arduinoval kapcsolatos játszadozást, de megint abba a helyzetbe kerültem, hogy az Arduino nem ismeri fel a kinti munkáimat. A gép érzékeli amikor csatlakozok pl. ESP3288-al, de nem látom a címét a router (a cím megegyezik a kintivel 192.168.1.1) (TpLinkWR1043 | suste/headless@OpenWrt@0.8.1 Barrier Breaker 14.07) listában.
Előre is köszi a segítséget. -
Janos250
őstag
válasz
tonermagus #15576 üzenetére
Nagyon gyorsan bele fogsz ütközni a GPS pontatlanságának a problémájába. Meg se mozdult az autó, a GPS mégis azt jelzi, hogy arrébb ment 2 méterrel. Valamelyest csökkenthető a hiba, ha olyan chipet használsz, ami sok műholdat használ egyszerre. Európában ezt a négy rendszert használjuk: GPS GLONASS Galileo Beidou. Ezeket tudnia kell kezelni a GPS-ednek, és jó, ha kétsávos.
Az igazi megoldás az RTK, de az bizony pénzízű. -
Janos250
őstag
válasz
tonermagus #15573 üzenetére
A chipgyártási mizéria a lapgyártókat még nem érte el, nekik még vannak felhalmozott készleteik. Félő, hogy ha a tartalékaik kifogynak, nem emelik-e ők is az árakat.
Ha a CO...19 és a keletiek istenei is úgy akarják, talán helyreáll a chipgyártás folyamata.
-
ekkold
Topikgazda
válasz
tonermagus #15576 üzenetére
Nekem bevált az STM32. Bevásároltam kínából néhány BluePill-t játszani, azóta pedig már egy ilyen vezérli a forrasztóállomásomat: [link]
-
Janos250
őstag
válasz
tonermagus #15576 üzenetére
Én átálltam, már rég. Amíg nem volt ESP32, addig az STM32 volt a kedvencem. Ugyanúgy Arduino rendszerben használtam, alig kellett valamit módosítani a programokon, mert a driverek - általában - meg vannak írva ugyanúgy rá Arduino alá. A különbség, hogy másik könyvtárból veszi a drivert, de ezt te nem is érzékeled. A nagyon hardver közeli dolgok persze mások. Bár egy ideje már nem használom, mert mindent ESP32-re tértem át több ok miatt: gyorsabb , két valós mag van benne, amíg az egyik foglalkozik valamivel, addig a másik pl. kezelheti a perifériákat, és az Arduinoba való illesztése is jobban sikerült - szerintem - mint az STM32-nek, gyakorlatilag elvétve kell valamit változtatni.
Összefoglalva: én mindenképpen átállnék az STM32-re, de ez mindenkinek a saját döntése kell legyen, hogy ne azt szidja utólag, aki "javasolta". Vagyis nem javasolok semmit, csak azt mondom el, én hogyan csinálnám.
-
válasz
tonermagus #15576 üzenetére
Én még sosem használtam, de egy előnye biztosan lenne, mégpedig akkus táplálásnál a kisebb tápfeszültség igény. Meg ha sok 3.3V szenzort használsz, nem kell őket illeszteni. Egyébként ha nincs egyéb érv ellene, az esetleges későbbi fejlesztési lehetőség miatt talán érdemes az STM32-t választani.
-
tonermagus
aktív tag
Köszönöm, így már érthető!
Egyébként nagyon gondolkodom az STM32-re váltáson. Ugyebár autópilótát építek. GPS koordinátát kér le másodpercenként 2 alkalommal (2Hz), szögeket számol, irányokat, távolságot kalkulál, szervókat forgat, motort vezérel, távirányítóról olvas be PWM értékeket, és még pár apróság.
Ugyebár az STM32 sokkal gyorsabb mint akármelyik Ardu. Kérdés hogy nekem szükségem van-e erre a sebesség többletre? Pont amiatt hogy a GPS lekérésre úgyis várni kell így úgy gondolom nincs értelme átváltani STM32-re. Arról nem is beszélve hogy sokkal macerásabb mert az egész nyáklap Arduinohoz lett igazítva, illetve a kódot is nagyon sok helyen módosítani kellene.
Tényleg nem tudom, hogy a váltás hozna-e valami hasznot. Szerintetek ilyen "kissebb" projekteknél van értelme váltani a jól megszokottról? Megbízhatóbb, professzionálisabb egy STM32? -
válasz
tonermagus #15573 üzenetére
Hát ez csak úgy lehet, hogy a mega board gyártója olyan nagy mennyiségben vásárolja a chipet, hogy annyival olcsóbban kapja, hogy a különbözetből kijön a pcb meg a járulékos alkatrészek ára (amit szintén nagy mennyiségben vásárol a gyártó), a külön chipet meg kevesen vásárolják (főleg, hogy már eléggé elavultnak számít), és ugye 1 darabnak mindig több az ára. Nézd meg, hogy az Alibaba-n mennyiért tudnál venni mondjuk 10000 darabot.
szerk.: lassan írtam
-
Dißnäëß
nagyúr
válasz
tonermagus #15565 üzenetére
Sztem azért, mert a komplett lapokat eszetlen mennyiségben sorozatgyártják, a beléjük való 2560-ast pedig ezek a gyártók diszkont áron, nagy tételben, bagóért megkapják, így egy komplett kis kütyü ára még az egyebekkel is kevesebbre jön ki, mintha egy magánszemély akarna 1, 2, vagy urambocsá, egy marék egyedülálló 2560-ast venni - ugy ô nem diszkont árat kap, valszeg.
De ha bekopogsz a gyártóhoz, hogy havi 1 millió kis chip kéne, szerzôdjünk, bemennél bôven fajlagos árban egy komplett board ára alá Te is.
-
-
-
Janos250
őstag
válasz
tonermagus #15563 üzenetére
Szerintem igen. A napokban mértem, de ha megtalálom, lemérem újra. Mivel én ESP32-vel mértem, ami ugyebár 3.3 V-os, 5V-al meg aztán végképp jó lesz. Én ennél jobbat csak az IRLB4030-at tudom.
-
válasz
tonermagus #15565 üzenetére
Érdekes kérdés. Honnan akartad beszerezni?
-
tonermagus
aktív tag
-
válasz
tonermagus #15563 üzenetére
Hát, nem vagyok egy elektromágus, szóval valaki majd kijavít, de a datasheet szerint a hőellenállása 62 C/W. Arduinoról hajtva 5V-on már majdnem teljesen kinyit, szóval, ha P = I * I * R, akkor 1,5 * 1,5 * 0,022 * 62 = 3 C-ot melegedne hűtés nélkül.
-
válasz
tonermagus #15561 üzenetére
IRLZ44N
-
tonermagus
aktív tag
Sziasztok!
Laikus számára tudnátok ajánlani olyan MOSFET-et, amit 12V-os eszköz kapcsolójaként használhatok, vezérelhető Arduinoval, elbír ~1-2 A-t, és könnyen beszerezhető?
Esetleg ha még dimmelni is bírok vele LED-e PWM-el akkor az lenne a legszuperebb. Ha egyáltalán ehhez MOSFET kellIlletve tudtok-e olyan DC-DC stepdownról, ami nyáklapra forrasztható és 12-18V-ról stabilan 12V-ot képes előállítani?
-
Tomika86
senior tag
Köszönöm mindenkinek.
Amint mechanikusan is tudok valami forgó másnest keríteni kipróbálom.
Holnap jelgenerátorral kitudom. -
-
Tomika86
senior tag
Kibogaráztam egy példaprogramot, ez impulzusokat számol:
const int hallPin = 2; // pin 2 = int 0
volatile unsigned long cntTime = 0;
volatile unsigned long cnt = 0;
void doCount()
{
cnt++;
cntTime = millis();
}
void setup()
{
Serial.begin(9600);
attachInterrupt(digitalPinToInterrupt(hallPin), doCount, FALLING); // hall pin on interrupt 0 = pin 2
cntTime = millis();
}
volatile unsigned long rpm = 0;
unsigned long measureTime = 0, curTime, startTime = 0;
int dispCnt = 0, measureCnt = 0;
const int resetTime = 2000;
const int minRotNum = 1; // 1 - calc after every rotation
void loop()
{
curTime = millis();
if ( curTime - cntTime > resetTime) // reset when less than 30RPM (dt>2s)
{
cnt = measureCnt = 0;
rpm = 0;
}
if (cnt == 1) startTime = cntTime;
if (cnt - measureCnt >= minRotNum) {
rpm = 60000L * (cnt - measureCnt) / (cntTime - measureTime);
measureCnt = cnt;
measureTime = cntTime;
}
}60000L itt mi az L?
-
válasz
Tomika86 #15545 üzenetére
Aztán túlcsordul 0-ra, akkor két fordulatnyit hibázni fog, mert csak 2-től számol a kód. Ilyenkor meg fog lódulni a mutató, és pl. 1000-es fordulatnál 333-at fog mutatni egy pillanatra.
Minden számítás után nullázni kell ezt a számlálót, és nem lesz gond. Mármint ha a másodpercenkénti impulzusok számából számolsz.Azthittem az impulzusok közötti időből lehet pontosabban számolni.
Mondom, ez a fordulatszámtól/periódusidőtől függ. Kis fordulatszámnál (pl. 0-100 közt) talán érdemesebb/pontosabb az impulzusok közötti időből számolni. De itt az is számít, hogy a loopban könnyebb az impulzusokat számolni meg az adatokat átlagolni, mint az interrupton belül pl. tömbbe menteni a periódusidőket, az átlagoláshoz. Átlagot pedig muszáj számolni (oversampling), ha nem szeretnéd, hogy darabosan közlekedjen a mutató.
-
válasz
Tankblock #15542 üzenetére
Igen, ez lenne a legjobb és legpontosabb megoldás, de csak nagyobb fordulatszám tartományban, például 500-8000 közt. És mondjuk az utolsó 3 mérés átlagát kéne kijelezni, így simább lenne a mutató mozgása.
Kisebb fordulatszám esetén nem lenne túl pontos, nem ártana tudni a mérési tartományt. -
Tankblock
aktív tag
válasz
Tomika86 #15541 üzenetére
Szia,
fordulatszám azaz adott idő alatt megtett fordulatok száma. Ha korlátozod az időt 1 [sec]re akkor csak az impulzusokat kell számolnod, majd viszonyítani a perchez. rpm / rotation per ,minute.... Nem tudom mekkora lesz a legmagasabb fordulatszám a byte sztem túl kicsi.....
-
válasz
Tomika86 #15539 üzenetére
Az interruptból vegyél ki minden számítást és tedd át a loop-ba, úgy, hogy csak ennyi legyen:
void impulzus() // Impulzus érzékelésre meghívás
{
fordulat++;
}Hogy miért? Két okból. Először is, az interruptot olyan rövidre kell írni, amennyire csak lehet. Másodszor, mert a millis() függvény interrupton belül nem működik (bár olvasni tudod, de nem számolja az időt, mert az is megszakítással működik) és ez rejtett hibához, pontatlansághoz vezethet.
A számításnál szerintem mozgóátlagot kéne számolni mert így elég hektikus lesz a mutató mozgása. -
Tomika86
senior tag
Ez így jó lehet nyers fordulatszámra?
volatile byte fordulat;
float impulzushossz_ms, rpm, holtido;
unsigned long elozoido;
void setup()
{
Serial.begin(9600);
attachInterrupt(0, impulzus, RISING); // Felfutóél detektálásra függvény meghívása
fordulat = rpm = elozoido = 0; // Minden változó inicializálása 0 értékre
}
void loop()
{
if (millis() - holtido > 2000) // Nincs impulzus 2000ms-ig
{
rpm = 0; // Fordulat nullázása
holtidő = millis();
}
Serial.println(rpm);
}
void impulzus() // Impulzus érzékelésre meghívás
{
fordulat++;
holtido = millis();
if (fordulat >= 2)
{
impulzushossz_ms = millis() - elozoido; // Idő 2 fordulathoz
rpm = 60000 / impulzushossz_ms; // Fordulat / perc
elozoido = millis();
}
} -
válasz
Tomika86 #15534 üzenetére
Én mindenképp a négyszög jelet választanám, digitális bemenetre, és megszakítással számolnám belőle a sebességet. Szerintem teljesen felesleges még egy plusz eszközt közé iktatni, ráadásul az analóg bemenet elég zaj és egyéb zavar érzékeny, és nem is biztos, hogy elég lenne a felbontása a pontos méréshez.
-
-
Tomika86
senior tag
Milyen hátrányokkal járna ha frekvencia - Feszültség konverterrel oldanám meg a fordulatszám és sebesség kijelzést?
[link] LM2917 IC-t néztem. Ehhez lehet változó reluktancia érzékelőt kötni, ami pont a főtengely jeladó és van is belőle pár darabom.A másik az LM1815 vagy MAX9924 IC lenne, ez is ilyen szenzorhoz van csak négyszög jelet ad a kimenetén.
-
Tomika86
senior tag
válasz
Janos250 #15526 üzenetére
Jól értem ha ez van
If (szam==1)
{ osszead;
}
Else if(szam==2)
{
kivonas;
}
Else if(szam==3)
{
szoroz;
}Jól értem, hogy ez ugyanaz mint a switch case break-el? Ha a szám nem egy akkor nézi azt hogy 2-e. Ha 2 akkor nem nézi meg hogy 3 e? Hanem kihagyja az utána lévő else if-eket?
-
Janos250
őstag
válasz
Tomika86 #15524 üzenetére
Ha több if van, mindenképp végigvizsgálja az összeset. Ha if-else , akkor ha egyet megtalált jónak, nem vizsgál tovább. Ha egész, vagy sorszámozható típus alapján válogatsz, a case áttekinthetőbbé teszi a programod. Et az if-elsek sorozata tulajdonképp, ha van benne break, if-ek sorozata egyébként.
-
Tomika86
senior tag
Van különbség ha több feltételt vizsgázok és mindegyiknél if() van használva, vagy ha csak az első if() a többi else if() ?
(Nem az if(igaz) else ha nem az első akkor ez)
-
Janos250
őstag
válasz
Tomika86 #15518 üzenetére
Ahogy ekkold is írta, szerintem is az spintf rá az egyik legjobb megoldás, mert akkor teljes formátumot is adhatsz.
https://www.cplusplus.com/reference/cstdio/sprintf/
Ez egy jó konverziós függvény, tanuld meg a használatát! -
Tomika86
senior tag
Furcsa dolog hogy 4 helyre betettem a következő logikát:
txt mezőbe írom a számot (pl 12),ezt a stringet kiolvasom, toInt függvénnyel integert csinálok belőle akkor amikor megnyomom a Ment nyomógombot.
Itt az int változót egy float változóba másolom.dostrf függvénnyel iratom vissza a kijelzőre, itt a hosszra megadok 4et, pontosságra 0át.
4 helyből 2 helyen működik. 2 helyen ha beírom az 1et akkor Mentés után 0 jön vissza.
Pedig ugyanúgy írtam mind a 4et.
-
Tomika86
senior tag
String kiiras = String (Integer_ertek);
Ez ugyanazt csinálja? csak itt string.h kell
-
Tomika86
senior tag
Létezik olyan függvény ami ugyanazt csinálja mint a dtostrf()
Csak integerből csinál stringet, nem pedig float-ból?
-
Tomika86
senior tag
Alakul
[link]
Szoftveres kalibráláshoz elég egy szorzó és egy ofset?
Vagy a skálázást kell módosítani? -
válasz
tonermagus #15512 üzenetére
Aki csak C kódot látott életében, sikítva fogja bezárni az assembly fájlt, még ha vissza is fejti, ebben biztos lehetsz.
-
tonermagus
aktív tag
Szuper! számomra ennyi elég.
A felhasználó akinek szánom képes arra hogy feltöltsön programokat, de azt viszont nem akarom hogy csak úgy nézegesse a forráskódot.
Ezekszerint a .hexben importálva, majd feltöltve a forráskód értelmezhetetlen lesz külső szemek számára. (ami nyilván nincs így, mert egy hozzáértő valószínűleg össze tudná rakni)
-
And
veterán
válasz
tonermagus #15510 üzenetére
Ja, látsz egy nyers kódot. Szimbólumnevek, kommentek, ugrási címkék, függvény- és rutinnevek nélkül. Ebben már kiigazodni sem könnyű, de alapszintű módosításokon (pl. egy konstans megváltoztatása) kívül szerkeszteni már nagyon nem egyszerű. Duplikálni jó, meg 'biztonsági másolatnak'.
-
válasz
tonermagus #15508 üzenetére
Ehhez gondolom még mindig kell az FTDI...Vagy valamilyen módon serial kapcsolatot kell indítanom a vezérlő irányába.
Minek kellene, ha a board-on rajta van gyárilag?
Beledugsz egy usb kábelt és kész.
Egyébként ez a .hex fájl mennyire védett, mennyire nehéz visszafejteni az olvasható kódot belőle?
Az eredeti C++ kódot sehogysem tudod belőle visszaállítani, ha erre gondolsz, de ahogy írtam, assembly-t viszonylag egyszerű csinálni belőle, nincs rajta semmilyen "védelem".
-
tonermagus
aktív tag
Az a megoldás működik, hogy:
Arduino IDE-ben kiválasztom a megfelelő alaplaptípust (pl. mega2560), majd a kódot a vázlat menüben exportálom a .hex fájlként.
A kapott .hex file-t pedig az Xloader programmal felöltöm a vezérlőre.
Ehhez gondolom még mindig kell az FTDI...Vagy valamilyen módon serial kapcsolatot kell indítanom a vezérlő irányába.
Egyébként ez a .hex fájl mennyire védett, mennyire nehéz visszafejteni az olvasható kódot belőle?
Szerk: #Aryes bocsi, csak most láttam mit írsz -
válasz
tonermagus #15506 üzenetére
FTDI vagy ISP, de csak ha nincs rajta a lapon gyárilag. Egyébként ha AVR-ről van szó, fentebb írtam, hogy parancssorból az avrdude-dal lehet kódot feltölteni, csinálsz hozzá egy .bat fájlt, összezipeled, és elküldöd.
És nem árt, ha drivert is mellékelsz, hátha nem teszi fel automatikusan. -
ekkold
Topikgazda
válasz
tonermagus #15503 üzenetére
Nyilván akkor a .bin fájlt kell odaadnod, de kell egy programozó eszköz (vagy csak szoftver), amivel fel lehet tölteni - ez a proci /alaplap típusától is függ.
-
tonermagus
aktív tag
Sziasztok!
Van arra valami lehetőség, hogy valakinek úgy adjam oda a kódomat, hogy ő fel tudja tölteni a mikrovezérlőre valamilyen megoldással, de magának a forráskódnak a tartalmát ne lássa...
Sokszor nem megoldott az, hogy én a helyszínen tudjak módosítani a programon.
Gondolok itt valamilyen feltöltőre
Új hozzászólás Aktív témák
Hirdetés
- NVIDIA GeForce RTX 5070 / 5070 Ti (GB205 / 203)
- SD-kártyát vennél? Ezért ne csak a GB-ot nézd! – Tech Percek #9
- Medence topik
- Allegro vélemények - tapasztalatok
- Fejhallgató erősítő és DAC topik
- ASUS notebook topic
- Motorola Moto Tag - nyomom, követ
- Melyik tápegységet vegyem?
- Xbox tulajok OFF topicja
- Gurulunk, WAZE?!
- További aktív témák...
- BESZÁMÍTÁS! MSI SUPRIM X RTX 4080 16GB videokártya garanciával hibátlan működéssel
- BESZÁMÍTÁS! 6TB Seagate SkyHawk SATA HDD meghajtó garanciával hibátlan működéssel
- BESZÁMÍTÁS! 4TB Samsung 870 EVO SATA SSD meghajtó garanciával hibátlan működéssel
- BESZÁMÍTÁS! Intel Core i7 8700K 6 mag 12 szál processzor garanciával hibátlan működéssel
- BESZÁMÍTÁS! Intel Core i7 4790 4 mag 8 szál processzor garanciával hibátlan működéssel
- Azonnali készpénzes AMD Ryzen 1xxx 2xxx 3xxx 5xxx processzor felvásárlás személyesen / csomagküldés
- Üzleti Fujitsu Lifebook u7510 15,6" FHD IPS 2021/08. havi gyártás
- ÁRGARANCIA!Épített KomPhone i5 12400F 16/32/64GB RAM RTX 4060 Ti 8GB GAMER PC termékbeszámítással
- Bomba ár! Lenovo ThinkPad Yoga 260 - i5-G6 I 8GB I 256SSD I 12,5" Touch I W10 I Cam I Gari!
- BESZÁMÍTÁS! ASROCK B650 R5 7600X 32GB DDR5 1TB SSD RTX 3070 8GB MSI MPG Gungnir 100 Enermax 750W
Állásajánlatok
Cég: PC Trade Systems Kft.
Város: Szeged
Cég: PC Trade Systems Kft.
Város: Szeged