====== Encodeur rotatif à Effet Hall Pandauto P3022 avec puce AS5048A ====== **Avec Communication en SPI** {{ :media_16:2_codeurs_ok.png?600 |}} =====AS5048A de AWS===== * **[[https://ams.com/as5048a|AS5048A High-Resolution Position Sensor 14-bit rotary position sensor with digital angle (interface) and PWM output]]** Sortie SPI et PWM. * 1 bit de parité * 1 bit error flag * 14 bits indiquant l'angle absolu sur 14 bits.\\ Lorsqu'on lit les données SPI dans les 2 octets, il y a donc les 6 derniers bits du premier octet à concaténé avec les 8 bits du second octet pour reconstituer le mot de 14 bits.\\ =====Ressources sur le SPI===== * **[[https://fr.wikipedia.org/wiki/Serial_Peripheral_Interface|Serial Peripheral Interface]]** Une liaison SPI est un bus de données série synchrone baptisé ainsi par Motorola, au milieu des années 1980 qui opère en mode full-duplex. * https://pinout.xyz/pinout/spi# * **[[spi_documentation_1|]]** * **[[communication_protocole_spi]]** ====Activation du SPI sur la Raspberry PI==== [[https://www.raspberryme.com/activer-linterface-spi-sur-le-raspberry-pi/#Methode_2_-_Utilisation_de_la_Configuration_Raspberry_Pi|Activation du SPI]] Aller dans Menu, Settings, Enable SPI, puis [[https://www.raspberryme.com/activer-linterface-spi-sur-le-raspberry-pi/#Etape_2_-_Verifier_si_SPI_est_active_facultatif|Vérifier si SPI est activé]] =====Sketch Arduino pour AS5048A===== * **[[https://github.com/ZoetropeLabs/AS5048A-Arduino|AS5048A-Arduino de ZoetropeLabs]]** La version originale pour Arduino * **[[https://github.com/eborghi10/AS5048A]]** eborghi10 propose une version pour arduino et esp32 ===Exemple pour Arduino UNO=== #include AS5048A angleSensor(10); void setup() { Serial.begin(115200); angleSensor.init(); } void loop() { delay(10); word val = angleSensor.getRawRotation(); Serial.println(val, DEC); } ===La lib a le cycle suivant=== * set à 0 du PIN Slave Select * envoi de 0b1111111111111111 * lecture * set à 1 du PIN Slave Select ===Récupération de l'angle sur la Pi=== Sur une UNO, le SPI est utilisé pour le capteur, la Pi doit récupérer les datas en [[communication_protocole_i2c|I2C]]. Compter 2 à 3 ms. =====Capteur sur la Pi en SPI===== {{ :media_16:pandauto_sur_pi_exemple.png?300 |}} Il est absolument nécessaire de brancher un adaptateur de tension entre la Pi (en 3.3V) et le capteur (en 5V). {{ :media_16:pandauto_sur_pi.png?500 |}} * **[[https://github.com/sergeLabo/furuta/tree/main/some_encoders/AS5048A/pandauto_on_pi_en_direct|pandauto_on_pi_en_direct]]** """ De Arduino en debug: Read (0x3FFF) with command: 0b1111111111111111 avec un transfert16 Read returned: 1101110100001010 Setting error bit 3433 Read (0x3FFF) with command: 0b1111111111111111 Read returned: 101110100000111 Setting error bit 3432 """ from time import time, sleep import pigpio CE = 8 pi = pigpio.pi() sensor = pi.spi_open(0, 1000000, 1) dt = 0.00001 pi.write(CE, 1) sleep(dt) t0 = time() n = -1 nbr = 1000 tempo = 0.03 while n < nbr: n += 1 pi.write(CE, 0) sleep(dt) c, d = pi.spi_xfer(sensor, int.to_bytes(65535, 2, 'big')) if c == 2: val = (d[0] & 0b00111111) << 8 | d[1] angle = int(val/4) # #if n % 20 == 0: # #print(angle) pi.write(CE, 1) sleep(tempo) pi.stop() periode = (((time() - t0) / nbr) - tempo)*1000 # ms print("periode =", round(periode, 2), "ms") sleep(1) """ periode = 1.9 ms il y a quelques incohérences dans les valeurs sans print periode = 1.3 ms periode = 1.19 ms """ **Sans print, le temps de récupération de la valeur est de 1.3 ms à 1 MHz et 1.2 ms à 3 MHz.** {{tag>arduino raspberry_pi sb spi}}