How to pour  développer sur les voitures de la Freescale Cup sur base Kinetis K40 / caméra linéaire

T. Grandpierre -avril 2013

 

Ce document a été créé à partir des différents emails envoyés pendant la Freescale Cup 2013.

Principaux liens 

Les infos de base sont disponibles sur le site de Freescale dédié à la coupe :

·         page d’accueil : https://community.freescale.com/docs/DOC-1284

o   règlement : https://community.freescale.com/docs/DOC-93225 (nous sommes dans la région « EMEA »)

o   Matériel :

§  Processeur : https://community.freescale.com/docs/DOC-1096 (nous avons choisi le processeur K40 Kinetis car les enseignements de programmation sur microcontrôleurs se font sur Cortex-M en E1 à l’ESIEE)

§  Caméra : https://community.freescale.com/docs/DOC-1030

§  Carte Puissance (pont en H) : https://community.freescale.com/docs/DOC-1059

·         pages  ESIEE dédiées à la Freescale Cup

o   http://www.esiee.fr/freescalecup2013/

o   http://www.esiee.fr/Actualites/actualite_finale2013_freescalecup.php

o   pages techniques :  http://www.esiee.fr/~grandpit/FC/QuickStartFreescaleCupTG.htm

Les fichiers projets référencés dans  ce document se trouvent ici :

 http://intra.esiee.fr/~grandpit/FC/freescalecupmaterialTG.zip (lien intra)

https://extra.esiee.fr/~grandpit/FC/freescalecupmaterialTG.zip (lien extra)

 

IDE : Code Warrior « CW_MCU_v10.2_SE.exe »

Nous avons utilisé la version windows de Code Warrior limitée en taille de binaire généré mais illimité dans le temps :

http://www.freescale.com/webapp/sps/site/prod_summary.jsp?code=CW-MCU10&fpsp=1&tab=Design_Tools_Tab et dans la colonne de droite : Special Edition: CodeWarrior for Microcontrollers 10.2 (Eclipse, Windows ...


TOWER K40

Drivers USB : c'est PnE, dans les projets sélectionner OSJTAG pour la Tower k40
-Sur mon PC bureau ESIEE sous XP, problème : j'ai dû désinstaller tous les drivers et installer les driversP&E.zip
-Sur mon  PC perso. (win7), j'ai installé les drivers 64bits (PEDrivers_install.exe, P&E Hardware Interface Drivers, Version 11 (Windows XP/Vista/7))
=>j'essaie aussi l'OSBDM Virtual Serial Toolkit qui permet d'accéder au port serie par usb (http://www.pemicro.com/osbdm/index.cfm)
(pemicro_osbdm_osjtag_tower_toolkit.exe) et j'essaie avec free-virtual-serial-ports.exe de hddsoftware.com.

===>Echec, P&E m'a informé que leur nouveau OSBDM firmware permet de voir la liaison série du BDM comme un comm. port standard (CDC), pour ca il faut juste faire un update firmware avec firmware_updater_install.exe de p&e (le numéro firmware est 31.21).

Procédure pour faire du serial other usb :

1) faire un update du firmware de l'interface JTAG/BDM de la carte tower avec le logiciel firmware_updater_install.exe sur le site de pemicro.com . Il suffit de l'installer, le lancer, choisir OSBDM, Kinetis puis quand il le demande débrancher la carte et ajouter le jumper JM60 sous l'écran du lcd (Normalement toutes les cartes ont été flashée maintenant, en avril)

2) quand on rebranche la carte twr : un nouveau port com apparait

3)Ensuite il suffit de changer votre appli tower pour qu'elle utilise ce com port qui passe par l’usb et partagé avec le  : k40_platform.h ET io.c (voir plus bas)

Info diverses  pour la voiture :

1)      Pour la clock : J'ai repris l'exemple d'initclock donné dans Kinetis Quick Reference User Guide (KQRUG.pdf)

2)      Infos PWM :  
En plus du datasheet voir document : PWM Synchronization Using Kinetis Flextimers (AN4560.pdf) et Using FlexTimer in ACIM/PMSM Motor Control Applications (AN 3729.pdf)

3)      Cablage : (voir derniere version dans les commentaires du code)

a.       Propulsion :
PTA8 sur elevateur B68 =  PORTA_PCR(8) = port_pcr_mux(3) | ...(ALT 3 FTM1_CH0)
PTA9 sur elevateur B67 = PORTA_PCR(9) = mux (3)  (ALT 3 FTM1_CH1)
enable irq commenté et le code de motor tick aussi
=> utilise donc FTM1

Et donc modifier aussi :
    //Enable the Clock to the FTM1 Module
    SIM_SCGC6 |= SIM_SCGC6_FTM1_MASK;

b.      Servo :
PTA6 sur elevateur A64 = PORTA_PCR6 = mux(3)
(ou a essayé sur PC4 (ALT 4) FM0_CH3 mais ne sortait aucun signal)
Ca utilise donc FTM0
enable_irq (INT-FTM0-16) + modif ligne 145 de kinetis_sysinit.c pour les vecteurs d'IT par irq 79 = servotickirq

Création d’un nouveau projet  depuis scratch :


a)créer un nouveau projet : new bareboard project, puis device K40->PK40X256, OpenSourceJTAG, puis reste par défaut
b)ajout des morceaux de gpio pour leds dans main
c)ajout du systick (pour delay) : copier dans header et source les fichiers /CPU/systick.h et .c ainsi que clock.h et .c
d)dans main ajout de initsystick() et dans projects_Settings/Startup_code/kinetis_sysinit.c ajout de l'include systick.h et de l'it numero 15
e)AJOUT PWM : copier PWM/PWM_servo.c et .h ainsi que PWM_motor.c et .h, copier aussi CPU/arm_cm4.c et .h pour def. de enable_irq utilisé
dans PWM_servo.c, modifier IRQ 78 de kinetis_sysinit.c
f)OK pour RAM mais pas en FLASH en copiant le clock.c (fonction initclock) venant du projet Kwikstick car le quartz est à....8Mhz sur TWR contre 4Mhz sur KS!! J'ai repris l'exemple d'initclock donné dans Kinetis Quick Reference User Guide (KQRUG.pdf)
D'ailleurs celui du KS provient de là (voir video youtube : clock kinetis)
=>ca marche en flash aussi alors qu'en flash tout plantait.

4)      Liason série (pour utiliser la liaison série other USB), 2 fichiers :

k40_platform.h :   

a.       #define TERMINAL_BAUD       9600

b.       #define TERM_PORT           UART3_BASE_PTR

       io.c  : #define TERM_PORT    UART0_BASE_PTR

Code complet :

 

Le project ESIEE_CARv0.zip contient un projet CW complet  qui regroupe tout :
Il fait des acquisitions camera envoyées sur la liaison série + calcul gradient,
+ modifie la vitesse + consigne de position

     ATTENTION CE CODE N’EST PAS DU TOUT Optimisé, = BASE de DEPART

cablage (revoir dans les commentaires dans  code) :

PWM servo : A64
PWM Moteurs : B67 et B68
Masses : A81,B81, A2,B2, A5,B5,A6,B6
+5v : A1, B1
Avec ce code pour mon servo les valeurs min max de consigne sont 4-7 et ~5 pour le neutre
Camera :
   Clock portA_12 : A25
   SI portA_13 : A23
   Analog portE_0 : B22
Pour info l'UART de la carte TWR-SER  utilisée c'est l'UART3 sur
   PortC_16 (RX du K40,SCI3 RX) : A43
   PORTC_17 (TX du K40, SCI3 TX) : A44

 

Affichage de l’image de la caméra linéaire :

 

                2 projets (voir répertoire «  2-ProjetsPourAffichageImageSurPC » du zip)

1)      sur  la kinetis : ESIEE_CARv1.1Kinetis.zip

2)      sur le PC : PC_ReadLineTWRv3-visual2010.zip (basé sur ofw)

 

Pour le tester il faut:
0) faire les connexions entre la caméra et la Tower qui sont dans le code source.
1) Sous CodeWarrior : passez en mode debug (la première fois choisir "test_camera twrk40....INTERNAL_RAM_OSJTAG dans debug configuration)
2) Lancer l’exécution sur la tower
3) Lancer SerialExampleDebug.exe sur le PC (attention pour le moment il est codé en dur avec le port COM8, Cf. plus bas pour le recompiler)
4) Cliquer dans la fenêtre graphique pour lancer l'échange de données entre la carte et le PC.
=> la fenêtre affiche alors l'image de la caméra et d'autres infos que je vous laisse découvrir...


=======================================
Pour recompiler l'application PC OFW , il faut :
1) MS visual 2010 (fonctionne aussi sous linux, mac etc)
2) télécharger OpenFramework : http://www.openframeworks.cc/download/ => choisir Windows=> visual studio 2010
vous devriez alors télécharger le fichier : of_v0073_vs2010_release.zip
3) le dézipper où vous voulez
4) déplacer mon sous-repertoire   PC_ReadLineTWRv3 pour le mettre dans le sous répertoire d'exemples de communication (dont je me suis fortement inspiré !) : \of_v0073_vs2010_release\examples\communication\
5) et ouvrir le projet SerialExample.sln sous visual 2010, le compiler et le lancer (l'exécutable est dans /bin)
=======================================

Ce projet contient 3 fichiers sources:
a) main.cpp qui déclare surtout la taille de la fenêtre graphique : pour moi 255 de large par 260 de haut
b) testApp.h qui contient la déclaration de la classe testApp : c'est là que vous pouvez déclarer les variables à communiquer entre
la partie communication RS232 et la partie affichage graphique

c) testApp.cpp qui contient tout le code :
- fonction setup => pour changer le numéro de com port (COM8 etc..)
-fonction update => fonction qui se charge de communiquer avec la carte avec les fonctions serial.writeByte et serial.ReadByte
-fonction draw => pour dessiner l’image venant de la caméra ainsi que calcul des gradients etc

Autre données :

                Le rapport final et le code de ce qui a tourné lors de la coupe est dans le répertoire « 3-RapportEtCodeFinal »

TO DO en vrac  :

·         Le calcul de l’asservissement se fait en flottant

·         La partie « vision » n’a pas été optimisée

·         Le PID ne s’exécute pas à période constante (car la durée de la boucle principale dépend de la durée du traitement côté vision)è pas d’IT pour le moment

·         Un seul PID, une seule vitesse…

·         Besoin d’enregistrer les données (images, erreur de l’asserv. ) et d’afficher ces infos pour post-interprétation : la kinetis peut enregistrer sur carte SD (ou on envoie par Zigbee).  Il existe un exemple qq part pour l’utilisation de la carte SD, mais il est basé sur le micro OS Freescale è c’est peut être l’occasion de l’essayer pour résoudre pb. précédent du PID.

·         Pas de freinage (inversion sur pont en H non modifiée) pour le moment