Servostyrning via datorns serieport

Detta projekt är faktiskt klart. Det går ut på att från t.ex serieporten på en dator styra flera servomotorer. Microkontrollern jag använder heter AT90S2313, och är en 8-bitars AVR.

Schemat:

Detta är en miniatyr av schemat. Det större schemat hittas HÄR.

IC1 är en mikrokontroller som måste programmeras (med flashcontents.hex tror jag) för att bygget ska fungera. Kontrollerns ben RXD och TXD kopplas via en spänningsomvandlare (ex MAX202CPE eller liknande) till serieporten. Port B kopplas direkt till styringångarna på de åtta servomotorerna.

Observera att bygget dels kräver en väl stabiliserad likspänning på 5 volt, samt helst en separat anslutning för servonas spänning.

När jag byggde kretsen satte jag in en 5V-regulator för strömförsörjningen till IC1 och IC2, och hade en separat anslutning för spänning till servomotorerna. Jag satte dessutom in ett motstånd i serie (1 k tror jag) för alla åtta ledningar på port B, för att skydda mikrokontrollern om ledningarna skulle kortslutas.

Komponentförteckning:
Motstånd: 8 st 1k (ej med på schemat, ansluts mellan portb-kontakterna på IC1 och servokontakterna )
Kondensatorer:
3 st 0,1 uF / 6,3 V, 2 st 0,1 uF / 16 V, 2 st 18 pF.
IC:
1 st AT90S2313, 1 st MAX202CPE.
Kontakter:
8 st tre-pinnars stiftlister, delning 2,54 mm, 1 st DSUB9F
Övrigt:
1 st 7,37280 MHz kristall

Dessutom spänningsreglering +5V mha 1 st 78L05, 1 st 100nF, 1 st 330nF (ej med på schemat)

Pris(2003) alla komponenter utom lådan c:a 175 kr hos labbelektronik (dom hade ej MAX202CPE, byt mot MAX232 och byt samtidigt alla 5 kondensatorer på 0,1uF mot kondensatorer på 1,0 uF)

Källkoden:

Källkoden finns i filen avr_servo.zip. Detta är kanske den slutgiltiga versionen.

Jag har skrivit en C-rutin som med liten overhead styr 8 servomotorer med hjälp av de två timers som finns i microkontrollern. Sen använder jag färdiga rutiner för att seriellt ta emot information om hur servona skall ställas, samt skicka information om hur alla servon står.

För att använda bygget går man in i hyperterminalen i Windows, ställer in Direkt anslutning via COM1 (eller vilken port den nu är inkopplad i). Sen ställer man in dataöverföringen till hastighet 9600, 8 bitar, ingen paritet, och INGEN FLÖDESREGLERING. När man slår på strömmen till kretsen får man ett introduktionsmeddelande, med lite hjälp. Jag skriver mer när jag varit till Södertälje och gjort några skärmdumpar på hur det ser ut (jag gav saken till lillbrorsan).

En kommentar är att man inte kan skicka data till lådan i för snab följd, för då kommer mikrokontrollerna att missa några byte. Ett sätt att hindra detta hade varit om jag sänkt kommunikationshastighete från 9600 bit/sek till något lägre. Ett annat vore att implementera hårdvaruhandskakning, det finns lediga omvandlare i IC2 för detta. Nu gör jag bara så at jag inte skickar data med maximal hastighet.

En sak som är praktisk för mig är att matlab kan använda serieporten i sina nyare versioner så man kan mata ut kommandon därifrån. Vet du inte vad matlab är så försök inte detta... Här finns filerna för ett exempel, avr_servo_matlab.zip (1 kB). Packa upp filerna i samma katalog, och kör servobox.m via matlab samtidigt som du har servon inkopplade till kanal ett och ev även till kanal 2 på bygget.

OBS! Du bygger alltid på egen risk, jag garanterar inte att något fungerar för dig.
Du ansvarar själv för risken att skada dig själv/andra/saker/datorer/eller annat!