micro:bit verslikt zich in geluid én servo’s

Bij het onderzoeken van verschillende driverboards voor de micro:bit bleek dat het niet lukte om geluid af te spelen terwijl een servomotor draaide. In eerste instantie dacht ik dat er ontwerpfout was gemaakt bij de driverboards. Het blijkt echter dat dit een beperking is van de micro:bit zelf.

Op micro:bit.org is dit beschreven in het Engels beschreven. Wat is er aan de hand?

Ben je niet zo geïnteresseerd in het technische verhaal? Klik dan hier voor de oplossing.

Het technische verhaal

We kijken eerst even apart naar de speaker en de servo:

Speaker

De speaker wordt aangestuurd met een blokvormig signaal waarvan de frequentie verandert. In de micro:bit wordt hiervoor een PWM (Pulse Width Modulation) signaal gebruikt. Dit signaal heeft een duty cycle van 50% (het is dus net zo lang hoog als laag) en varieert in frequentie.

Servo

Een servo wordt aangestuurd met een PWM-signaal waarvan de frequentie gelijk is (voor de populaire blauwe servo’s is dit 50 Hz) maar waarbij de duty cycle wordt veranderd van 5% tot 10%. Hierbij horen een ‘AAN-tijd’ van 1 milliseconde en 2 milliseconde. Dit komt weer overeen met een stand van 0° tot 180°.

Schuif het logo hieronder om de pulsbreedte aan te passen.

En wat is nu het probleem?

De micro:bit heeft maar één interne timer die gebruikt wordt om het audiosignaal én het servosignaal te maken. Dus als de toonhoogte verandert dan verandert ook de frequentie van het servosignaal en dat vindt de servo niet leuk.

Wat is de oplossing?

De oplossing is dat je de poorten P0 (luidspreker) en P1 (servo) uitschakelt als deze niet worden gebruikt. Je gebruikt dus om de beurt de interne timer.

De code ziet er dan zo uit:

De tonen worden iedere keer 1 seconde afgespeeld, daarna wordt de poort P0 uitgeschakeld en wordt de servo op poort P1 ingesteld. Hiervoor krijgt deze een halve seconde waarna de servopoort P1 wordt uitegschakeld.

Dit is de link naar de code: https://makecode.microbit.org/_YYg8E3Hw2RkV