Jane. Suke: Pour unMicroPythonLa version transplantée a été testée à titre préliminaire.En revanche,MCUIl y a beaucoup de modules qui ne sont pas encore pris en charge.Ces travaux doivent être complétés dès que possible par des essais supplémentaires à court terme.
Mots clés
: MM32,MicroPython
Pour être en mesure de Concours national de voitures intelligentes pour les étudiants universitaires Introduction basée sur MicroPython Modèle de développement,.Les étudiants qui ne sont pas des professionnels de l'électronique peuvent participer à la course de voiture intelligente.En fait, dans les courses précédentes,Basé surNXPDeOpenMV,OpenARTLes modules ont été adoptés etMicroPythonModèle de développement,Mais ces modules ne sont pas encore en mesure de fournir plus de ports pour le développement de modèles de course de voitures intelligentes.
Voici un micro - ordinateur à puce unique basé sur la technologie Flying - by - FlyingMM32F3277Module de développement pour,Qui a été initialement inhibéMicroPythonL'environnement de.
In La mise en service vient de voler MM32F3277 La transplantation a MicroPythonConseil de développement Des informations sur le Conseil de développement sont présentées , Et a établi le passage REPL Une chaîne d'outils pour le développement interactif .
▲ Fig.1.1.1 Module de base envoyé en vol
Utilisation STM32 Bootloader Composition du logiciel MicroPythonDeREPL Interface interactive , Et peut mettre le MicroPython Télécharger le programme à MM32Direct.En même temps,REPL Afficher les informations de sortie .
Voici les instructions d'exploitation du matériel de développement envoyé par Flying - by - Flying Technology .
Connectez une carte mère normale , La plaque envoyée a été connectée à l'écran et insérée SDCarte;
▲ Fig.1.2.1 Avant du matériel du tableau de développement
S'il vous plaît utiliser la batterie ou la source de tension stabilisée pour alimenter à partir du cordon d'alimentation , La tension est recommandée 8V(Plus que6VC'est tout.).
Ou on peut utiliser un noyau noir Type-CAlimentation électrique, Mais n'utilisez que Type-C Pas d'accès à l'appareil à gouverner pendant l'alimentation électrique .
▲ Fig.1.2.2 Derrière la version de développement SDFente de carte
Au dos. SD Prise de carte ,ConnectéSDCarte, Activer la carte de fonctionnement par défaut main.py, Le phénomène est sur le noyau noir LEDClignotant.
▲ Fig.1.2.3 Interface de téléchargement du port de débogage du tableau de développement
Port série connectez le port série de l'interface de téléchargement et de débogage de la Carte Noire ,Taux de Baud115200, Passez par ici après l'allumage RPELInteraction,Il est important de noter que,SiSD Kane a déjà main.py Alors la priorité sera donnée main.py:
▲ Fig.1.2.4 Terminal sériePuTTYInterface
En ce moment, c'est SD Kane main.pyDocumentation, Notre accessoire SD La carte devrait Python Le programme ne définit pas la sortie , Donc il n'y a pas d'accès RPEL.
Il fautSDCartemain.py Supprimer ou boucler le fichier , Ici, nous choisissons de supprimer le fichier , Rechargez la carte et Réinitialisez :
▲ Fig.1.2.5 EntréeREPL Effectuer l'état de mise en service
Entrez maintenantRPEL, Et produit MicroPythonVersion.
Sur la base des exemples ci - joints pyDocumentation, Vous pouvez essayer d'exécuter l'effet d'affichage
▲ Fig.1.2.6 ExécutionLCD180.help()Après les résultats
Exécuter l'instruction ci - dessus , Correspond à l'énergie électrique LCD L'écran se rafraîchit en rouge plein écran et affiche SEEKFREEMots.
Les principes peuvent être téléchargés à partir du lien suivant : MM32F3277Schéma du tableau principal
▲ Fig.1.2.7 Définition de la broche de la carte mère centrale
▲ Fig.1.2.8 Définition de l'interface du plan arrière
▲ Fig.1.2.9 5V Schéma d'alimentation électrique
Il y a 3- Oui.3.3V L'alimentation électrique est fournie séparément pour un usage général 3.3V,Caméra, Puissance de l'amplificateur opérationnel .
▲ Fig.1.2.10 Caméra3.3VAlimentation électrique
▲ Fig.1.2.11 Alimentation électrique de l'appareil à gouverner
▲ Fig.1.2.12 Définition partielle de la broche d'interface
▲ Fig.1.2.13 Définition partielle de la broche d'interface
▲ Fig.1.2.14 Définition partielle de la broche d'interface
VoiciMM32F3277 A été transplanté MicroPythonFonction. Cet article fait un essai préliminaire de ces fonctions .
▲ Fig.1.3.1 Maintenant transplanté MicroPythonFonctions auxiliaires
from seekfree import GPIO
pinpg1 = GPIO(0x67, 1, 1)
print("Test GPIO .")
while True:
pinpg1.low()
pinpg1.high()
Mesure à l'aide d'un oscilloscope MM32Du moduleG7 Forme d'onde pin .
▲ Fig.2.1.1 Mesure à l'aide d'un oscilloscope MM32Du moduleG7 Forme d'onde pin
▲ Fig.2.1.2 G7 Forme d'onde de sortie du port
Réussir les tests ci - dessus ,Je vois.MicroPython La période suivante pour le fonctionnement du port est d'environ :22.28 μ s \mu s μs.
Comme le code ci - dessus est finalement un cycle mort ,Il faut donc passer parMM32 Réinitialiser pour appeler à partir d'un cycle mort .
Pour pouvoir contrôler à partir du logiciel MM32Réinitialiser, Ajouter au port de débogage d'origine NRSTLigne de contrôle.
▲ Fig.2.1.3 Modifier le port de débogage ,AjouterRSTPort de contrôle
PourSTM32DeMPDLD Ajout de MM32 Processus de Réinitialisation .
if(strncmp(szString, "MPDLD", 5) == 0) {
// MicroPython Dlownload
char szString[0x8000];
strcpy(szString, "");
Clipboard()->GetTextBuf(szString, sizeof(szString) - 1);
ClearInfor();
ShowInfor("Reset MicroPython...");
RTSEnable(1, PORT1);
Sleep(50);
ClearPort(PORT1);
RTSEnable(0, PORT1);
Sleep(100);
ShowInfor("Wait for MicroPython comeback...");
for(;;) {
char c;
if(ReceChar(&c, PORT1) == 0) break;
}
int nLength = strlen(szString);
int i;
int nLine = 0;
for(i = 0; i < nLength; i ++) {
if(szString[i] == '\r') nLine ++;
}
char szTemp[512];
sprintf(szTemp, "Download MicroPython : %d lines/%d characters.", nLine, nLength);
ShowInfor(szTemp);
ShowInfor("Begin to download programm...");
Sleep(100);
MessageBeep(0);
SendChar(0x2, PORT1); // Send CTRL+B
Sleep(100);
SendChar(0x5, PORT1); // Send CTRL+A
Sleep(100);
for(i = 0; i < nLength; i ++) {
ProgressBar1->Position = (i + 1) * 100 / nLength;
SendChar(szString[i], PORT1);
}
for(;;) {
char c;
if(ReceCharL(&c, PORT1, 20) > 0) break;
}
ShowInfor("-------------------------------------------------------------------------");
SendChar(0x4, PORT1); // Send CTRL+B
return;
}
Après modification, Pour les programmes de recyclage , Il est également facile de télécharger automatiquement le programme .
from seekfree import GPIO
pinpg1 = GPIO(0x67, 1, 1)
print("Test GPIO .")
while True:
pinpg1.toggle()
▲ Fig.2.1.4 toggle() La forme d'onde de sortie correspondant à la fonction
Vu la forme d'onde ci - dessus , toggle( ) Temps d'exécution légèrement plus long low(), high()Plus lentement..
Il n'y a pas de timeModule, Ce module peut fournir des opérations retardées .Donc,, .L'intervalle ne peut être réalisé que par un délai logiciel .
Connectez le port série sans fil HEADERDansC6,C7,GND,+5VExportation,TestsGPIOContrôle de sortieLED.
from seekfree import GPIO
led1 = GPIO(0x26, 1, 1)
led2 = GPIO(0x27, 1, 0)
print('Test LED.')
while True:
def delay(loop):
for _ in range(loop):
pass
led1.high()
led2.low()
delay(20000)
led1.low()
led2.high()
delay(20000)
▲ Fig.2.1.5 LED Délai clignotant
▲ Fig.2.1.6 Touches et interrupteurs sur la carte de circuit
Comme le montre le diagramme de circuit matériel précédent , Quatre touches sont intégrées sur la carte de circuit :G0,G1,G2,G3. Les ports correspondants sont :GPIOG0, G1,G2,G3.
▲ Fig.2.1.7 Quatre touches sur le tableau de développement
from seekfree import GPIO
led1 = GPIO(0x26, 1, 1)
led2 = GPIO(0x27, 1, 0)
btn1 = GPIO(0x60, 0, 1)
btn2 = GPIO(0x61, 0, 1)
btn3 = GPIO(0x62, 0, 1)
btn4 = GPIO(0x63, 0, 1)
print('Test LED.')
def delay(loop=50000):
for _ in range(loop):
pass
while True:
print([btn1.value(), btn2.value(), btn3.value(), btn4.value()])
delay(50000)
Il y a aussi deux interrupteurs de cadran sur la carte de circuit ,Correspondant séparémentD14,D15.AdoptionGPIO On peut lire leur état . Le test est effectué de la même manière que pour les touches ci - dessus .
from seekfree import GPIO
print('Test LED.')
def delay(loop=50000):
for _ in range(loop):
pass
led1 = GPIO(0x26, 1, 1)
led2 = GPIO(0x27, 1, 0)
btn1 = GPIO(0x60, 0, 1)
btn2 = GPIO(0x61, 0, 1)
btn3 = GPIO(0x62, 0, 1)
btn4 = GPIO(0x63, 0, 1)
sw1 = GPIO(0x3e, 0, 1)
sw2 = GPIO(0x3f, 0, 1)
while True:
print([btn1.value(), btn2.value(), btn3.value(), btn4.value(), sw1.value(), sw2.value()])
delay(50000)
▲ Fig.2.1.8 Touches de mesure et interrupteurs de cadran
▲ Fig.2.2.1 ADC.help() Afficher le message
Connectez le connecteur du module électromagnétique à la plaque de pain , Utiliser un potentiomètre pour obtenir une tension différente ,Envoyé àA4.
▲ Fig.2.2.2 Acquis1024 - Oui.ADCValeur numérique
Variance des données : 5.
Parce queMicroPython Les opérations en virgule flottante ne sont pas prises en charge . Il faut donc utiliser un nombre entier pour effectuer les calculs pertinents .
from seekfree import ADC,GPIO
adc = ADC(0)
adc.channel_init(adc.A4)
print('Test ADC.')
def delay(loop=50000):
for _ in range(loop):
pass
def sqrt(x):
left = 0
right = x//2+1
while left < right:
middle = left + (right-left+1)//2
square = middle * middle
if square > x:
right = middle-1
else: left = middle
return left
SAMPLE_NUM = 1024
adcdim = [0]*SAMPLE_NUM
for i in range(SAMPLE_NUM):
adcdim[i] = adc.value(adc.A4)
print(adcdim)
count = 0
for s in adcdim:
count += s
average = count//SAMPLE_NUM
sigma = 0
for s in adcdim:
ss = s - average
sigma += ss**2
print(sqrt(sigma//SAMPLE_NUM))
Sur la bêta PWMPasser séparémentA0,A1,A2,A3Produits.
from seekfree import PWM,GPIO
pwm = PWM(16000)
pwm.channel_init(pwm.A0, 5000)
print("Test PWM")
▲ Fig.2.3.1 A0ProduitsPWMForme d'onde
▲ Fig.2.3.2 A0ProduitsPWMForme d'onde
from seekfree import PWM,GPIO,ADC
pwm = PWM(16000)
pwm.channel_init(pwm.A0, 500)
adc = ADC(0)
adc.channel_init(adc.A4)
def delay(loop=50000):
for _ in range(loop):
pass
print('Test PWM...')
while True:
adcvalue = adc.value(adc.A4)
pwmvalue = adcvalue*10000//0x1000
print(adcvalue, pwmvalue)
pwm.duty(pwm.A0, pwmvalue)
delay(10000)
▲ Fig.2.3.3 Secouée PWM
Par paires ADC Après avoir fait la moyenne ,ContrôlePWM, La forme d'onde est très stable .
from seekfree import PWM,GPIO,ADC
pwm = PWM(16000)
pwm.channel_init(pwm.A0, 5000)
adc = ADC(0)
adc.channel_init(adc.A4)
def delay(loop=50000):
for _ in range(loop):
pass
print('Test PWM...')
while True:
sigma = 0
for i in range(256):
sigma += adc.value(adc.A4)
adcvalue = sigma//256
pwmvalue = adcvalue*10000//0x1000
pwm.duty(pwm.A0, pwmvalue)
delay(1000)
▲ Fig.2.3.4 AdoptionADCChangementPWMCycle de service
Définir la fonction de rappel du minuteur .
from seekfree import TIMER,GPIO
led1 = GPIO(0x26, 1, 1)
led2 = GPIO(0x27, 1, 0)
def timer_callback(s):
led1.toggle()
print(s.count())
tim = TIMER(200)
tim.callback(timer_callback)
while True:
pass
C'est exact.ÀMM32DeMicroPythonLa version transplantée a été testée à titre préliminaire. Vous pouvez également voir que cette version du travail de migration a encore besoin d'un certain enrichissement .
Les fonctions ci - dessus doivent être encore améliorées par des compléments ultérieurs .
■ Liens vers des documents connexes:
● Liens graphiques connexes: