|
A klónok CH340 Soros-USB illesztőjének drivere ( Letöltés)
Ki hogyan nevezi, adatlapban konkrétan megnevezik. A lényeg, hogy tudjuk, miről van szó. Ezért használom inkább a program memória kifejezést, de ha google-lel rákereses, bizony már flash-nek nevezik.
A flash alapú kontrollerek (ma már ugye szinte mind ilyen) program memóriája írás szempontjából NAND flash jellegű (nem törölhető bájtonként, hanem csak nagyobb blokkok törölhetőek egyszerre), az adat EEPROM meg NOR flash (azaz bájtonként törölhető és írható). Valószínűleg ezért tér el az az újraírhatósági ciklusszáma is. Amúgy erről itt egy kis iromány.
Már amelyikben van. Nagyon soknál csak lecsípnek egy kicsit a progmemből és kész.
Azt olvastam, hogy amikor egy arduinót külső tápról hajtunk akkor 7V-tól 12V-ig ajánlott a táplálás. Igaz az, hogy 5V-tól 7V-ig bizonytalan az arduinó működése ha külső tápot használunk? A hozzászólás módosítva: Ápr 17, 2020
Az AMS1117 adatlapja azt írja, hogy az 5V-os változatnak 6.5..12V bemenő feszültség kell a stabil 5V kimeneti feszültség előállításához. Ha még ezzel sorba kapcsolódik egy dióda ami a megakadályozza, hogy fordított polaritás rákapcsolása esetén kijöjjön a panelból a működtető füst, akkor pont kijön a 7V minimum.
És nagyon tessék betartani a 12V-ot is, mert kijön a működtető füst mindenhonnan. Mint ma nekem.
Le se merem írni, de én pár nano mini pro-t kifüstöltem, liion 3s2p 11éves akkupakkal. Valahogy az a pici stabmorzsa ezt sem szereti. Azóta a raw bemenetet félve használom, ha muszáj akkor 10-33 Ohm ellenállással sorba, úgy kibírja.
Csak DC-DC konverterrel használom. Eddig nem füstöltek el.
Igen, más tápegységmegoldással nem volt bajom még. Az a gyanúm maradt, hogy a tápfeszültség felfutási ideje és indulási keménysége és a panelig vezető vezeték hossza (nálam 1 méter az akkun) illetve az induktivitása okoz valami feszültség túllövést... A hozzászólás módosítva: Ápr 18, 2020
Van olyan készülékem, amiben Ardu van. 2 db li-ion celláról üzemelnek, és a 1117-es stabilizálja. Ha fordítva teszem rá a tápot, akkor elfüstöl a 1117. Persze ezután gyorsan ráteszem helyes polaritással, hátha visszajavul. Ilyenkor általában a 1117 rövidzárban van már és a két li-ion cella 7.4 voltos feszültségét direktbe kapja a z MCU. Meg a 1602-es LCD is. De a túlfeszre nem panaszkodnak, azt eddig mindig kibírták.
Ajaj!!! Én 12V-os ledtáppal használom . Ezzel elvileg nem lehet gond ,de a jövőhéten jön meg a dc-dc step down konverterem. A hozzászólás módosítva: Ápr 18, 2020
Az a táp nem fönyeremény, az igazi LED tápok áramgenerátorosak, igy a feszültségük változhat. Igaz igy látatlanban nem tudjuk milyen is az a LED táp.
optonica 36w DC 12V 3A . Stabilizált táp led-ekhez
Nem minden "LED-táp-nak" nevezett táp áramgenerátoros. Ne keverjük a dolgokat! Ő 12V-os tápról ír (feszültség generátor), nem pedig egy 350mA-es áramgenerátorról! A hozzászólás módosítva: Ápr 18, 2020
Nem is állitottam, de nem mindegyik 12 V-s LED táp ad stabil 12 V-t ( pl a butorokba épitett LED tápok többsége áramgenerátoros és 12 V van ráirva.)
Bocs feltenném megint ide az eddigi Arduino Due-val megvalósított fmszint munkám legújabb verzióját.
Kezeli a szabványos i2c-n meghajtott 2x16-os lcd-t. (ahol ugye egyszerre csak 1 karaktert ír). Illetve 8 gombbal mászkálni lehet a menüben, és paramétereket állítani, opto csatolóval serial portról veszi a Midi jelet. 1fajta, de nagyon finoman állítható reverb motor, illetve 10 hangszín elmenthető a DueFlashStorage.h függvénytár segítségével, bár itt még tesztelésre szorul, pár paramétert nem ment el, amit nem nagyon értettem miért... Most már tényleg kezd aranyos lenni, bár vannak bagok, remélem lesz módom befejezni, ha nem hátha ráakad valaki egyszer...
Sziasztok valaki meg tudná mondani hogy ezen a videón a iletö milyen programit használ? hogy a telefon gps ét joystick al tudja irányítani vagy esetleg valaki tudna ilyen firmware készíteni ardiunora úgy hogy a pokemon go va működjön? https://www.youtube.com/watch?v=PYIEex4NIyI
Sziasztok,
valami nem kerek a programomban. A Setupban lévő Serial.printig úgy érzem el sem jut.
Valamelyik konstruktorban történhet valami, ahonnan nem lép tovább (I2C működik, azt teszteltem).
Első gondolatom az volt, hogy csurig van a stack, de hogy tudom ezt ellenőrizni?
Rá tudna pillantani valaki? (Egy 4WD robot lesz, mind a négy hajtáson PID. 2db PCA9685 ad PWM-et, az encodereket pedig 4db Mini Pro számolja.)
Előre is nagyon szépen köszönöm!
#include <Wire.h>
//#include <Arduino.h>
class Hajtomu
{
public:
double KP, KI, KD;
boolean engedely;
word PWM_min;
word encoder_ertek, U, Y, hiba, elozo_hiba, derivativ_hiba, integral_hiba, tickPerSec;
uint8_t i2c_encoder_cim, pwm_board, PWM_EN_pin, PWM_PWM_pin, PWM_INA_pin, PWM_INB_pin;
uint8_t T = 200;
boolean forgasirany, iranyvaltas = false;
public:
Hajtomu ( uint8_t pwm_board, uint8_t i2c_encoder_cim, uint8_t PWM_EN_pin, uint8_t PWM_PWM_pin, uint8_t PWM_INA_pin, uint8_t PWM_INB_pin, boolean forgasirany ) :
pwm_board ( pwm_board ),
i2c_encoder_cim( i2c_encoder_cim ),
PWM_EN_pin( 6 + 4 * PWM_EN_pin ),
PWM_PWM_pin( 6 + 4 * PWM_PWM_pin ),
PWM_INA_pin( 6 + 4 * PWM_INA_pin ),
PWM_INB_pin( 6 + 4 * PWM_INB_pin ),
forgasirany( forgasirany )
{
Reset ();
}
void Encoder_beolvasas ( void )
{
Wire.requestFrom ( i2c_encoder_cim, ( uint8_t ) 2 );
char x = Wire.read (); char y = Wire.read ();
encoder_ertek = word ( x, y );
if ( encoder_ertek > ( 65535 / 2 ) )
encoder_ertek = 65535 - encoder_ertek;
}
void Ws ( word U )
{
derivativ_hiba = U - encoder_ertek;
hiba = derivativ_hiba + elozo_hiba;
Y = ( ( KP * hiba ) + ( KD * derivativ_hiba ) + ( KI * integral_hiba ) );
elozo_hiba = hiba;
integral_hiba += hiba;
}
void Kimenet ( void )
{
iranyvaltas = ( Y < 0 ) ^ forgasirany;
Y = abs ( Y );
if ( Y > 4095 )
Y = 4095;
else
Y = Y * ( ( 4095 - PWM_min ) / ( 4095 + PWM_min ) );
Wire.beginTransmission ( pwm_board );
Wire.write ( PWM_INA_pin );
if ( iranyvaltas )
{
Wire.write ( 0 ); Wire.write ( 0 ); Wire.write ( 4095 ); Wire.write ( 4095 >> 8 );
}
else
{
Wire.write ( 4095 ); Wire.write ( 4095 >> 8 ); Wire.write ( 0 ); Wire.write ( 0 );
}
Wire.endTransmission ();
Wire.beginTransmission ( pwm_board );
Wire.write ( PWM_INB_pin );
if ( !iranyvaltas )
{
Wire.write ( 0 ); Wire.write ( 0 ); Wire.write ( 4095 ); Wire.write ( 4095 >> 8 );
}
else
{
Wire.write ( 4095 ); Wire.write ( 4095 >> 8 ); Wire.write ( 0 ); Wire.write ( 0 );
}
Wire.endTransmission ();
Wire.beginTransmission ( pwm_board );
Wire.write ( PWM_PWM_pin );
Wire.write ( 0 ); Wire.write ( 0 ); Wire.write ( Y ); Wire.write ( Y >> 8 );
Wire.endTransmission ();
Wire.beginTransmission ( pwm_board );
Wire.write ( PWM_EN_pin );
if ( !engedely )
{
Wire.write ( 4095 ); Wire.write ( 4095 >> 8 ); Wire.write ( 0 ); Wire.write ( 0 );
}
else
{
Wire.write ( 0 ); Wire.write ( 0 ); Wire.write ( 4095 ); Wire.write ( 4095 >> 8 );
}
Wire.endTransmission ();
}
public:
void Start ( word U )
{
Enable ( true );
Encoder_beolvasas ();
Ws ( U );
Kimenet ();
}
void SetKP ( double Kp ) { KP = Kp; }
void SetKI ( double Ki ) { KI = Ki; }
void SetKD ( double Kd ) { KD = Kd; }
void SetPWM_min ( word PWM_min ) { PWM_min = PWM_min; }
void Enable ( boolean En ) { engedely = En; }
void Stop ( void )
{
Enable ( false );
Wire.beginTransmission ( pwm_board );
Wire.write ( 6 + 4 * PWM_EN_pin );
Wire.write ( 0 ); Wire.write ( 0 ); Wire.write ( 4095 ); Wire.write ( 4095 >> 8 );
Wire.endTransmission ();
}
void Reset ( void ) // Eldobja minden számláló minden értékét
{
Stop ();
Encoder_beolvasas ();
encoder_ertek, U, hiba, elozo_hiba, integral_hiba, derivativ_hiba = 0;
}
};
void PWM_board_setup ( uint8_t cim1, uint8_t cim2 )
{
Wire.beginTransmission ( cim1 );
Wire.write ( ( uint8_t ) 0 );
Wire.write ( ( uint8_t ) 128 ); // Újraindítás
Wire.endTransmission ();
Wire.beginTransmission ( cim2 );
Wire.write ( ( uint8_t ) 0 );
Wire.write ( ( uint8_t ) 0x80 ); // Újraindítás
Wire.endTransmission ();
delay ( 10 ); // Ébredésre várakozás
Wire.beginTransmission ( cim1 );
Wire.write ( ( uint8_t ) 0 );
Wire.write ( ( uint8_t ) 16 ); // Tente
Wire.endTransmission ();
Wire.beginTransmission ( cim1 );
Wire.write ( ( uint8_t ) 254 );
Wire.write ( ( uint8_t ) 101 ); // prescaler beállítása
Wire.endTransmission ();
Wire.beginTransmission ( cim1 );
Wire.write ( ( uint8_t ) 0 );
Wire.write ( ( uint8_t ) 0 ); // nullás módba állunk (ébresztés)
Wire.endTransmission ();
Wire.beginTransmission ( cim1 );
Wire.write ( ( uint8_t ) 0 );
Wire.write ( ( uint8_t ) 160 ); // auto increment bekapcsolása (128 | 32)
Wire.endTransmission ();
Wire.beginTransmission ( cim2 );
Wire.write ( ( uint8_t ) 0 );
Wire.write ( ( uint8_t ) 16 );
Wire.endTransmission ();
Wire.beginTransmission ( cim2 );
Wire.write ( ( uint8_t ) 254 );
Wire.write ( ( uint8_t ) 101 );
Wire.endTransmission ();
Wire.beginTransmission ( cim2 );
Wire.write ( ( uint8_t ) 0 );
Wire.write ( ( uint8_t ) 0 );
Wire.endTransmission ();
Wire.beginTransmission ( cim2 );
Wire.write ( ( uint8_t ) 0 );
Wire.write ( ( uint8_t ) 160 );
Wire.endTransmission ();
delay ( 5 ); // megvárjuk
uint8_t totempole; // Kimenet totempole-ra állítása
Wire.beginTransmission ( ( uint8_t ) 64 );
Wire.write ( ( uint8_t ) 1 );
Wire.endTransmission ();
Wire.requestFrom ( ( uint8_t ) 64, ( uint8_t ) 1 );
totempole = ( 1, Wire.read () | 4);
Wire.beginTransmission ( ( uint8_t ) 64 );
Wire.write ( ( uint8_t ) 1 );
Wire.write ( totempole );
Wire.endTransmission ();
Wire.beginTransmission ( ( uint8_t ) 65 );
Wire.write ( ( uint8_t ) 1 );
Wire.endTransmission ();
Wire.requestFrom ( ( uint8_t ) 65, ( uint8_t ) 1 );
totempole = ( 1, Wire.read () | 4 );
Wire.beginTransmission ( ( uint8_t ) 65 );
Wire.write ( ( uint8_t ) 1 );
Wire.write ( totempole );
Wire.endTransmission ();
delay ( 5 ); // megvárjuk
}
// A pilóta osztály végzi a számítógéptől érkező parancsok feldolgozását, ezen utasítások alapján végzi a jármű mozgásának irányítását.
class Pilota
{
Hajtomu* mot[4] = {
new Hajtomu ( ( uint8_t ) 64, ( uint8_t ) 6, ( uint8_t ) 0, ( uint8_t ) 1, ( uint8_t ) 2, ( uint8_t ) 3, false ),
new Hajtomu ( ( uint8_t ) 64, ( uint8_t ) 7, ( uint8_t ) 4, ( uint8_t ) 5, ( uint8_t ) 6, ( uint8_t ) 7, true ),
new Hajtomu ( ( uint8_t ) 65, ( uint8_t ) 4, ( uint8_t ) 0, ( uint8_t ) 1, ( uint8_t ) 2, ( uint8_t ) 3, true ),
new Hajtomu ( ( uint8_t ) 65, ( uint8_t ) 5, ( uint8_t ) 4, ( uint8_t ) 5, ( uint8_t ) 6, ( uint8_t ) 7, false )
};
public:
Pilota ()
{
for ( uint8_t i = 0; i < 4; i++ )
{
mot[i]->SetKP ( 6.0 );
mot[i]->SetKI ( 4.0 );
mot[i]->SetKD ( 6.0 );
mot[i]->SetPWM_min ( 300 );
mot[i]->Enable ( false );
}
}
void Megy ( uint8_t ertek )
{
for ( uint8_t i = 0; i < 4; i++ )
mot[i]->Start ( ertek );
}
void Enable () { for ( uint8_t i = 0; i < 4; i++ ) mot[i]->Enable ( true ); }
void Stop ( void ) { for ( uint8_t i = 0; i < 4; i++ ) mot[i]->Stop (); }
void SetKp ( float K ) { for ( uint8_t i = 0; i < 4; i++ ) mot[i]->KP = K; }
void SetKi ( float K ) { for ( uint8_t i = 0; i < 4; i++ ) mot[i]->KI = K; }
void SetKd ( float K ) { for ( uint8_t i = 0; i < 4; i++ ) mot[i]->KD = K; }
};
String mySt = "";
char myChar;
boolean stringComplete;
void setup()
{
Wire.begin ();
Wire.setClock ( 100000 );
Serial.begin ( 115200 );
delay ( 1000 );
Serial.println ( "0" );
PWM_board_setup ( ( uint8_t ) 64, ( uint8_t ) 65 );
}
Pilota* Miska = new Pilota();
void loop()
{
Serial.println ("0");
if ( stringComplete )
{
if ( mySt.substring ( 0, 2 ) == "En" )
Serial.println ("ENABLED");
Miska->Enable ();
if ( mySt.substring ( 0, 2 ) == "St" )
Miska->Stop ();
if ( mySt.substring ( 0, 3 ) == "Seb" )
Miska->Megy ( mySt.substring ( 3, mySt.length () ).toInt () );
if ( mySt.substring ( 0, 2 ) == "KP" )
Miska->SetKp ( mySt.substring ( 2, mySt.length () ).toFloat () );
if ( mySt.substring ( 0, 2 ) == "KI" )
Miska->SetKi ( mySt.substring ( 2, mySt.length () ).toFloat () );
if ( mySt.substring ( 0, 2 ) == "KD" )
Miska->SetKd ( mySt.substring ( 2, mySt.length () ).toFloat () );
mySt = "";
stringComplete = false;
}
}
void serialEvent ()
{
while ( Serial.available () )
{
char inChar = ( char ) Serial.read ();
if ( inChar != '\n' )
mySt += inChar;
if ( inChar == '\n' )
stringComplete = true;
}
}
Szia!
Ezekkel a classokkal nem vagyok tisztában teljesen, de a 29. sorban nem kell lezárni azt? }; -?
Vagy ha az egész egy class akkor a legvégén? Látom nem, mert a 125. sorban mintha lezárnád. A hozzászólás módosítva: Ápr 20, 2020
Megtaláltam, a problémát az okozta, hogy a Miska pilótát kint hoztam létre, tehát rögtön a futás első ciklusaiban ő csinált négy hajtómű osztályt, amik használni akarták már a konstruktorból az I2C-t. Az viszont még nem állt készen, hiszen azt a setupban indítom. Ugyan nem az volt a baj, amire gondoltál, de azért köszönöm szépen!
Így már működik(bár nem igazán tetszik):
String mySt = "";
char myChar;
boolean stringComplete, set;
void setup()
{
Wire.begin ();
Wire.setClock ( 100000 );
Serial.begin ( 115200 );
delay ( 1000 );
Serial.println ( "Setup" );
PWM_board_setup ( ( uint8_t ) 64, ( uint8_t ) 65 );
set = false;
}
Pilota* Miska = nullptr;
void loop()
{
if ( !set )
{
Serial.println ("Miska generalodik");
Pilota* Miska = new Pilota();
Serial.println ( "Miska kesz" );
set = true;
}
Nem néztem át, csak szemet szúrt hogy a Hajtomu osztályban 2 deklarálsz public ként.7. sor, 17. sor
Ha az emlékeim nem csalnak, ez nem okozhat gondot, akár minden tag elé beírható. A nagyja amúgy private lesz, csak a fenti hiba miatt mindent átírtam publicra, nehogy belezavarodjak.
Szia, a videó leírásában megtalálható a szoftverre mutató githubos link. De a kommentek alapján úgy néz ki, hogy fake/kamu/átejtés.
Custom ROM-mal szerintem meg lehet csinálni úgy, hogy a GPS device-ot helyettesíted egy programmal, ami kiadja a tetszőleges koordinátákat. Tehát nem a GPS működik, hanem egy program, ami kiadja a GPS adatfolyamot magából.
Gondolom, hogy valódi GPS jelet is létre lehetne valahogy hozni, de úgy tippelném, hogy illegális, mivel azokon a csatornákon mi nem adhatunk, nem zavarhatjuk a szolgáltatást.
Egyszerűbb szerintem tiltani a beépített GPS-t, és emulálni egy vezetékes usb-s gps vevőt. Nem tudom a mostani telók tudnak-e még ilyet fogadni, pár éve még csak így ment az igo például. Pár munkaórát bele lehet tolni az biztos
Sziaztok!
A következő programmal egy magas vágó szűrőt tudok csinálni:
long y; //globális változó
cikus {
....
bufferbe =kiszamolthangertek;
....
y = (freq1 * y + freq2 * bufferbe) / 10000;
audio buffer[ bufferindex] = y;
....
}
A kérdésem az lenne:
1. Hogyan tudom a vágás meredekségét (jóságát) jobbá tenni?
2. Hogyan tudok mély vágó szűrőt csinálni? (Elgondolásom az volt, hogy az eredeti jelből kivonom a magas vágás értéknek kiszámolt y-t, majd korrigálom a hangerőt, de ez nem nagyon jött be nekem....
Fontos lenne az egésszámos megvalósítás...
A freq1 és a freq2 viszonya egy 1-127-ig állítható eqvalue értékhez:
freq1 = (eqvalue / 123) * 100;
freq2 = (127 - eqvalue / 99) * 100;
Én ezt az oldalt használtam szűrő tervezéshez (FIR szűrő). Kész kódot is generál, beraktam a mellékletbe amit én generáltattam vele, és a legegyszerűbb 72MHz-es stm32f103-on teljesen jól működik 76000Hz mintavételi frekvencián. A hozzászólás módosítva: Ápr 21, 2020
Hú ez nagy segítség, remélem sikerül beimplementálni!
Köszönöm!
|
|