A simple antenna rotor for the MLA-30 or similar small and light antennas. Only a few parts are needed and it is easy to print, preferably in PETG.
You can mount it in different ways, on a tripod, with a table clamp or simply with screws.
I would still have to work a little on the software, but it works so far.
The stepper motor is sufficient in the 5 volt version, it does not require much power and can be operated via usb.
The tube is simply attached to the 8mm bolts with a little PVC tape.
Mechanical parts
5 x M5 Threaded Inserts
5 x M5 Screws, longer than 20mm shorter than 50mm
2 x M3 Threaded Inserts
2 x M3 Screws, longer than 15mm
1 x M8 Screws, longer than 100mm
2 x 608zz ball bearing
1 x MR128ZZ ball bearing
1 x Round tube plastic 12 mm
Electronic parts
1 x 28BYJ-48 Steppermotor 5 Volts
1 x Stepper motor driver (e.g. ULN2003)
1 x Arduino
Software
Arduino Code:
https://elektro.turanis.de/html/prj143/index.html and Arduino Example
#define PIN_IN1 9 // blue
#define PIN_IN2 8 // pink
#define PIN_IN3 7 // yellow
#define PIN_IN4 6 // orange
int incomingByte; // a variable to read incoming serial data into
unsigned int lowSpeed = 1600; // max: 16000
unsigned int highSpeed = 1000;
void setup()
{
Serial.begin(9600);
pinMode(PIN_IN1, OUTPUT);
pinMode(PIN_IN2, OUTPUT);
pinMode(PIN_IN3, OUTPUT);
pinMode(PIN_IN4, OUTPUT);
}
void loop()
{
unsigned long n = millis() / 3000; // 3 seconds
if (Serial.available() > 0) {
// read the oldest byte in the serial buffer:
incomingByte = Serial.read();
if (incomingByte == 'R') {
rotateRight(lowSpeed);
}
if (incomingByte == 'L') {
rotateLeft(lowSpeed);
}
if (incomingByte == 'S') {
stopMotor();
}
}else{
stopMotor();
}
}
void rotateRight(unsigned int motorSpeed)
{
setMotor(LOW, LOW, LOW, HIGH, motorSpeed);
setMotor(LOW, LOW, HIGH, HIGH, motorSpeed);
setMotor(LOW, LOW, HIGH, LOW, motorSpeed);
setMotor(LOW, HIGH, HIGH, LOW, motorSpeed);
setMotor(LOW, HIGH, LOW, LOW, motorSpeed);
setMotor(HIGH, HIGH, LOW, LOW, motorSpeed);
setMotor(HIGH, LOW, LOW, LOW, motorSpeed);
setMotor(HIGH, LOW, LOW, HIGH, motorSpeed);
}
void rotateLeft(unsigned int motorSpeed)
{
setMotor(HIGH, LOW, LOW, LOW, motorSpeed);
setMotor(HIGH, HIGH, LOW, LOW, motorSpeed);
setMotor(LOW, HIGH, LOW, LOW, motorSpeed);
setMotor(LOW, HIGH, HIGH, LOW, motorSpeed);
setMotor(LOW, LOW, HIGH, LOW, motorSpeed);
setMotor(LOW, LOW, HIGH, HIGH, motorSpeed);
setMotor(LOW, LOW, LOW, HIGH, motorSpeed);
setMotor(HIGH, LOW, LOW, HIGH, motorSpeed);
}
void stopMotor()
{
setMotor(LOW, LOW, LOW, LOW, 0);
}
void setMotor(byte in1, byte in2, byte in3, byte in4, unsigned int motorSpeed)
{
digitalWrite(PIN_IN1, in1);
digitalWrite(PIN_IN2, in2);
digitalWrite(PIN_IN3, in3);
digitalWrite(PIN_IN4, in4);
delayMicroseconds(motorSpeed);
}
Python Code
#!/usr/bin/env python3
import PySimpleGUI as sg
import serial
import sys
import glob
def serial_ports():
""" Lists serial port names
:raises EnvironmentError:
On unsupported or unknown platforms
:returns:
A list of the serial ports available on the system
https://stackoverflow.com/a/14224477
"""
if sys.platform.startswith('win'):
ports = ['COM%s' % (i + 1) for i in range(256)]
elif sys.platform.startswith('linux') or sys.platform.startswith('cygwin'):
# this excludes your current terminal "/dev/tty"
ports = glob.glob('/dev/tty[A-Za-z]*')
elif sys.platform.startswith('darwin'):
ports = glob.glob('/dev/cu.*')
else:
raise EnvironmentError('Unsupported platform')
result = []
for port in ports:
try:
s = serial.Serial(port)
s.close()
result.append(port)
except (OSError, serial.SerialException):
pass
return result
sg.theme('DarkRed1')
font1 = ("Arial, 16")
font0 = ("Arial, 8")
layout = [
[sg.Text('Serial Port', size=(10, 1),font=font1)],
[sg.Combo(serial_ports(),size= (20,1),font=font1,key='seriel_port')],
[sg.Text('Steps', size=(10, 1),font=font1)],
[sg.InputText('10',font=font1, size=(10,1), key='steps', enable_events=True)],
[sg.Button('Right',font=font1, button_color=('white', 'DarkRed'), key='right')],
[sg.Button('Left',font=font1, button_color=('white', 'DarkRed'), key='left')]
]
window = sg.Window("Rotator",
layout,
default_element_size=(14,2),
text_justification='r',
# auto_size_text=False,
keep_on_top = True,
auto_size_buttons=False,
return_keyboard_events=True,
default_button_element_size=(14,1),
finalize=True)
while True:
event, values = window.read()
steps = int(values['steps'])
ser = serial.Serial(values['seriel_port'], 9600)
if event == sg.WIN_CLOSED:
exit(69)
if event == 'right':
for i in range(steps):
ser.write(b'R')
if event == 'left':
for i in range(steps):
ser.write(b'L')
The author hasn't provided the model origin yet.