Stap 4: Arduino Code in diepte
De bits verzonden naar en van de N64-controller op de ene draad-interface zijn gecodeerd in 4 µs breed pulsen. Een '0' is 3 µs lage en hoge 1 µs. Een '1' is 1 µs lage en 3 µs hoog.
De Arduino code in de methode N64_send of N64_receive zeer zorgvuldig getimede assemblagecode geschreven door Andrew Brown kunt bits-bang de data lijn om te communiceren met de controller. NOP blokken worden gebruikt om te wachten met de juiste hoeveelheid µs polling van de lijn van het verzenden van gegevens.
Bij het opstarten, 0x00 is verzonden aan de controller, en dan na dat de enige opdracht gebruikt 0x01 aan query voor de status van de controleur.
Gegevens coderen
Wanneer de gegevens worden ontvangen na een 0x01, komt het als 16-bits knop vaninformatie en 16 bits van analoge joystick informatie. De gegevens eruit als 44000000000000400044440044000444.
Het formaat van de bits is: A, B, Z, Start, Dup, Ddown, Dleft, cleren, 0, 0, L, R, Cup, Cdown, gespleten, Cright + 16 bits van de positie van de analoge stick.
De methode translate_raw_data() doorloopt de 32 bits, invoegen van hen in de struct N64_status. De eerste 16 bits zijn eenvoudig 1 of 0, maar de laatste 16 zijn vertaald in een geheel getal in het bereik (-80, 80) ongeveer door
voor (ik = 0; ik < 8; i ++) {}
N64_status.stick_x | = N64_raw_dump [16 + ik]? (0x80 >> ik): 0;
}
Nadat de gegevens in deze eenvoudige vorm, is het gemakkelijk om te doen wat je wilt. In dit geval, is het gewoon verzonden via de seriële poort in de loop-methode als een koord van binaire gegevens met twee gehele getallen voor de x- en y waarden.
De gegevens die worden verzonden via de seriële poort als volgt uitzien: 0400000000000400 63 -67 , hetgeen betekenen zou dat twee knoppen werden ingedrukt en de stick controle bij 63 was, -67.