Compare commits
No commits in common. "main" and "jc" have entirely different histories.
|
@ -0,0 +1,382 @@
|
|||
{
|
||||
"Protocol_1": {
|
||||
"Control_Table": {
|
||||
"Model_Number": [
|
||||
0,
|
||||
2
|
||||
],
|
||||
"Firmware_Version": [
|
||||
2,
|
||||
1
|
||||
],
|
||||
"ID": [
|
||||
3,
|
||||
1
|
||||
],
|
||||
"Baud_Rate": [
|
||||
4,
|
||||
1
|
||||
],
|
||||
"Return_Delay_Time": [
|
||||
5,
|
||||
1
|
||||
],
|
||||
"CW_Angle_Limit": [
|
||||
6,
|
||||
2
|
||||
],
|
||||
"CCW_Angle_Limit": [
|
||||
8,
|
||||
2
|
||||
],
|
||||
"Temperature_Limit": [
|
||||
11,
|
||||
1
|
||||
],
|
||||
"Min_Voltage_Limit": [
|
||||
12,
|
||||
1
|
||||
],
|
||||
"Max_Voltage_Limit": [
|
||||
13,
|
||||
1
|
||||
],
|
||||
"Max_Torque": [
|
||||
14,
|
||||
2
|
||||
],
|
||||
"Status_Return_Level": [
|
||||
16,
|
||||
1
|
||||
],
|
||||
"Alarm_LED": [
|
||||
17,
|
||||
1
|
||||
],
|
||||
"Shutdown": [
|
||||
18,
|
||||
1
|
||||
],
|
||||
"Multi_Turn_Offset": [
|
||||
20,
|
||||
2
|
||||
],
|
||||
"Resolution_Divider": [
|
||||
22,
|
||||
1
|
||||
],
|
||||
"Torque_Enable": [
|
||||
24,
|
||||
1
|
||||
],
|
||||
"LED": [
|
||||
25,
|
||||
1
|
||||
],
|
||||
"D_Gain": [
|
||||
26,
|
||||
1
|
||||
],
|
||||
"I_Gain": [
|
||||
27,
|
||||
1
|
||||
],
|
||||
"P_Gain": [
|
||||
28,
|
||||
1
|
||||
],
|
||||
"Goal_Position": [
|
||||
30,
|
||||
2
|
||||
],
|
||||
"Moving_Speed": [
|
||||
32,
|
||||
2
|
||||
],
|
||||
"Torque_Limit": [
|
||||
34,
|
||||
2
|
||||
],
|
||||
"Present_Position": [
|
||||
36,
|
||||
2
|
||||
],
|
||||
"Present_Speed": [
|
||||
38,
|
||||
2
|
||||
],
|
||||
"Present_Load": [
|
||||
40,
|
||||
2
|
||||
],
|
||||
"Present_Voltage": [
|
||||
42,
|
||||
1
|
||||
],
|
||||
"Present_Temperature": [
|
||||
43,
|
||||
1
|
||||
],
|
||||
"Registered": [
|
||||
44,
|
||||
1
|
||||
],
|
||||
"Moving": [
|
||||
46,
|
||||
1
|
||||
],
|
||||
"Lock": [
|
||||
47,
|
||||
1
|
||||
],
|
||||
"Punch": [
|
||||
48,
|
||||
2
|
||||
],
|
||||
"Realtime_Tick": [
|
||||
50,
|
||||
2
|
||||
],
|
||||
"Current": [
|
||||
68,
|
||||
2
|
||||
],
|
||||
"Torque_Ctrl_Mode_Enable": [
|
||||
70,
|
||||
1
|
||||
],
|
||||
"Goal_Torque": [
|
||||
71,
|
||||
2
|
||||
],
|
||||
"Goal_Acceleration": [
|
||||
73,
|
||||
1
|
||||
]
|
||||
},
|
||||
"Values": {
|
||||
"Min_Position": 0,
|
||||
"Max_Position": 4095,
|
||||
"Max_Angle": 360
|
||||
}
|
||||
},
|
||||
"Protocol_2": {
|
||||
"Control_Table": {
|
||||
"Control_Table": {
|
||||
"Model_Number": [
|
||||
0,
|
||||
2
|
||||
],
|
||||
"Model_Information": [
|
||||
2,
|
||||
4
|
||||
],
|
||||
"Firmware_Version": [
|
||||
6,
|
||||
1
|
||||
],
|
||||
"ID": [
|
||||
7,
|
||||
1
|
||||
],
|
||||
"Baud_Rate": [
|
||||
8,
|
||||
1
|
||||
],
|
||||
"Return_Delay_Time": [
|
||||
9,
|
||||
1
|
||||
],
|
||||
"Drive_Mode": [
|
||||
10,
|
||||
1
|
||||
],
|
||||
"Operating_Mode": [
|
||||
11,
|
||||
1
|
||||
],
|
||||
"Secondary_ID": [
|
||||
12,
|
||||
1
|
||||
],
|
||||
"Protocol_Type": [
|
||||
13,
|
||||
1
|
||||
],
|
||||
"Homing_Offset": [
|
||||
20,
|
||||
4
|
||||
],
|
||||
"Moving_Threshold": [
|
||||
24,
|
||||
4
|
||||
],
|
||||
"Temperature_Limit": [
|
||||
31,
|
||||
1
|
||||
],
|
||||
"Max_Voltage_Limit": [
|
||||
32,
|
||||
2
|
||||
],
|
||||
"Min_Voltage_Limit": [
|
||||
34,
|
||||
2
|
||||
],
|
||||
"PWM_Limit": [
|
||||
36,
|
||||
2
|
||||
],
|
||||
"Current_Limit": [
|
||||
38,
|
||||
2
|
||||
],
|
||||
"Acceleration_Limit": [
|
||||
40,
|
||||
4
|
||||
],
|
||||
"Velocity_Limit": [
|
||||
44,
|
||||
4
|
||||
],
|
||||
"Max_Position_Limit": [
|
||||
48,
|
||||
4
|
||||
],
|
||||
"Min_Position_Limit": [
|
||||
52,
|
||||
4
|
||||
],
|
||||
"Shutdown": [
|
||||
63,
|
||||
1
|
||||
],
|
||||
"Torque_Enable": [
|
||||
64,
|
||||
1
|
||||
],
|
||||
"LED": [
|
||||
65,
|
||||
1
|
||||
],
|
||||
"Return_Status_Level": [
|
||||
68,
|
||||
1
|
||||
],
|
||||
"Registered_Instruction": [
|
||||
69,
|
||||
1
|
||||
],
|
||||
"Hardware_Error_Status": [
|
||||
70,
|
||||
1
|
||||
],
|
||||
"Velocity_I_Gain": [
|
||||
76,
|
||||
2
|
||||
],
|
||||
"Velocity_P_Gain": [
|
||||
78,
|
||||
2
|
||||
],
|
||||
"Position_D_Gain": [
|
||||
80,
|
||||
2
|
||||
],
|
||||
"Position_I_Gain": [
|
||||
82,
|
||||
2
|
||||
],
|
||||
"Position_P_Gain": [
|
||||
84,
|
||||
2
|
||||
],
|
||||
"Feedforward_2nd_Gain": [
|
||||
88,
|
||||
2
|
||||
],
|
||||
"Feedforward_1st_Gain": [
|
||||
90,
|
||||
2
|
||||
],
|
||||
"BUS_Watchdog": [
|
||||
98,
|
||||
1
|
||||
],
|
||||
"Goal_PWM": [
|
||||
100,
|
||||
2
|
||||
],
|
||||
"Goal_Current": [
|
||||
102,
|
||||
2
|
||||
],
|
||||
"Goal_Velocity": [
|
||||
104,
|
||||
4
|
||||
],
|
||||
"Profile_Acceleration": [
|
||||
108,
|
||||
4
|
||||
],
|
||||
"Profile_Velocity": [
|
||||
112,
|
||||
4
|
||||
],
|
||||
"Goal_Position": [
|
||||
116,
|
||||
4
|
||||
],
|
||||
"Realtime_Tick": [
|
||||
120,
|
||||
2
|
||||
],
|
||||
"Moving": [
|
||||
122,
|
||||
1
|
||||
],
|
||||
"Moving_Status": [
|
||||
123,
|
||||
1
|
||||
],
|
||||
"Present_PWM": [
|
||||
124,
|
||||
2
|
||||
],
|
||||
"Present_Current": [
|
||||
126,
|
||||
2
|
||||
],
|
||||
"Present_Velocity": [
|
||||
128,
|
||||
4
|
||||
],
|
||||
"Present_Position": [
|
||||
132,
|
||||
4
|
||||
],
|
||||
"Velocity_Trajectory": [
|
||||
136,
|
||||
4
|
||||
],
|
||||
"Position_Trajectory": [
|
||||
140,
|
||||
4
|
||||
],
|
||||
"Present_Input_Voltage": [
|
||||
144,
|
||||
2
|
||||
],
|
||||
"Present_Temperature": [
|
||||
146,
|
||||
1
|
||||
]
|
||||
}
|
||||
},
|
||||
"Values:": {
|
||||
"Min_Position": 0,
|
||||
"Max_Position": 4095,
|
||||
"Max_Angle": 360
|
||||
}
|
||||
}
|
||||
}
|
20
README.md
20
README.md
|
@ -1,20 +0,0 @@
|
|||
# USDA Pecan IOT Tablet Configuration
|
||||
|
||||
This repo contains separate branches for each tablet to store the
|
||||
individualized software.
|
||||
|
||||
Each of:
|
||||
|
||||
- jc
|
||||
- meyer
|
||||
- sheller
|
||||
|
||||
All 3 branches implement contain the prerequisites for setting up a
|
||||
Systemd service to listen to and control equipment via MQTT, as well
|
||||
as sending back relevant diagnostic and statistical information.
|
||||
|
||||
Files:
|
||||
|
||||
- mqtt_listener.py: The main Python application interacting with MQTT
|
||||
- mqtt_listener.service: The file to install to /etc/systemd/system/
|
||||
- mqtt_start.sh: The entrypoint from Systemd to Python
|
|
@ -0,0 +1,68 @@
|
|||
{
|
||||
"Protocol_2": {
|
||||
"Control_Table": {
|
||||
"Model_Number": [0, 2],
|
||||
"Model_Information": [2, 4],
|
||||
"Firmware_Version": [6, 1],
|
||||
"ID": [7, 1],
|
||||
"Baud_Rate": [8, 1],
|
||||
"Return_Delay_Time": [9, 1],
|
||||
"Drive_Mode": [10, 1],
|
||||
"Operating_Mode": [11, 1],
|
||||
"Secondary_Shadow_ID": [12, 1],
|
||||
"Protocol_Type": [13, 1],
|
||||
"Homing_Offset": [20, 4],
|
||||
"Moving_Threshold": [24, 4],
|
||||
"Temperature_Limit": [31, 1],
|
||||
"Max_Voltage_Limit": [32, 2],
|
||||
"Min_Voltage_Limit": [34, 2],
|
||||
"PWM_Limit": [36, 2],
|
||||
"Current_Limit": [38, 2],
|
||||
"Velocity_Limit": [44, 4],
|
||||
"Max_Position": [48, 4],
|
||||
"Min_Position": [52, 4],
|
||||
"External_Port_Mode_1": [56, 1],
|
||||
"External_Port_Mode_2": [57, 1],
|
||||
"External_Port_Mode_3": [58, 1],
|
||||
"Startup_Configuration": [60, 1],
|
||||
"Shutdown": [63, 1],
|
||||
"Torque_Enable": [64, 1],
|
||||
"LED": [65, 1],
|
||||
"Status_Return_Level": [68, 1],
|
||||
"Registered_Instruction": [69, 1],
|
||||
"Hardware_Error_Status": [70, 1],
|
||||
"Velocity_I_Gain": [76, 2],
|
||||
"Velocity_P_Gain": [78, 2],
|
||||
"Position_D_Gain": [80, 2],
|
||||
"Position_I_Gain": [82, 2],
|
||||
"Position_P_Gain": [84, 2],
|
||||
"Feedforward_2nd_Gain": [88, 2],
|
||||
"Feedforward_1st_Gain": [90, 2],
|
||||
"Bus_Watchdog": [98, 1],
|
||||
"Goal_PWM": [100, 2],
|
||||
"Goal_Current": [102, 2],
|
||||
"Goal_Velocity": [104, 4],
|
||||
"Profile_Acceleration": [108, 4],
|
||||
"Profile_Velocity": [112, 4],
|
||||
"Goal_Position": [116, 4],
|
||||
"Realtime_Tick": [120, 2],
|
||||
"Moving": [122, 1],
|
||||
"Moving_Status": [123, 1],
|
||||
"Present_PWM": [124, 2],
|
||||
"Present_Current": [126, 2],
|
||||
"Present_Velocity": [128, 4],
|
||||
"Present_Position": [132, 4],
|
||||
"Velocity_Trajectory": [136, 4],
|
||||
"Position_Trajectory": [140, 4],
|
||||
"Present_Input_Voltage": [144, 2],
|
||||
"Present_Temperature": [146, 1],
|
||||
"Backup_Ready": [147, 1],
|
||||
"External_Port_Data_1": [152, 2],
|
||||
"External_Port_Data_2": [154, 2],
|
||||
"External_Port_Data_3": [156, 2],
|
||||
"Indirect_Address_1": [168, 2],
|
||||
"Indirect_Address_2": [170, 2],
|
||||
"Indirect_Address_3": [172, 2]
|
||||
}
|
||||
}
|
||||
}
|
|
@ -0,0 +1,88 @@
|
|||
import paho.mqtt.client as mqtt
|
||||
import re
|
||||
from dynio import *
|
||||
import time
|
||||
import threading
|
||||
from statistics import mean
|
||||
from collections import deque, Counter
|
||||
|
||||
# State variable to check if HOME is received before POS
|
||||
home_received = False
|
||||
dxl_io = []
|
||||
feed_motor = None
|
||||
|
||||
def set_feed(num):
|
||||
global feed_motor
|
||||
feed_motor.set_velocity(75)
|
||||
feed_motor.torque_enable()
|
||||
feed_motor.set_position(int(convert_to_ticks(num)))
|
||||
|
||||
def disable_torque():
|
||||
global feed_motor
|
||||
feed_motor.torque_disable()
|
||||
|
||||
def convert_to_ticks(angle):
|
||||
# Define the input range
|
||||
min_input = 0
|
||||
max_input = 90
|
||||
|
||||
# Define the output range
|
||||
max_output = 1212
|
||||
min_output = max_output - 1024
|
||||
|
||||
# Ensure the angle is within the input range
|
||||
angle = max(min(angle, max_input), min_input)
|
||||
|
||||
# Perform the inverse linear transformation
|
||||
value = ((angle - min_input) / (max_input - min_input)) * (max_output - min_output) + min_output
|
||||
|
||||
return value
|
||||
|
||||
# The callback for when the client receives a CONNACK response from the server.
|
||||
def on_connect(client, userdata, flags, rc):
|
||||
print(f"Connected with result code {str(rc)}")
|
||||
|
||||
# Subscribing in on_connect() means that if we lose the connection and
|
||||
# reconnect then subscriptions will be renewed.
|
||||
client.subscribe("/jc/feed")
|
||||
|
||||
# Connect to Dynamixels
|
||||
global dxl_io, feed_motor
|
||||
dxl_io = dxl.DynamixelIO('/dev/ttyS0')
|
||||
feed_motor = dxl_io.new_mx64(2, 2)
|
||||
feed_motor.get_position()
|
||||
|
||||
# The callback for when a PUBLISH message is received from the server.
|
||||
def on_message(client, userdata, msg):
|
||||
global home_received, feed_motor
|
||||
|
||||
message = msg.payload.decode()
|
||||
|
||||
pos_num = float(message) # Extract the number from the message and convert to float
|
||||
set_feed(pos_num)
|
||||
|
||||
# Define a function to continuously report the log
|
||||
def continuous_log_reporting():
|
||||
global feed_motor
|
||||
while True:
|
||||
if feed_motor:
|
||||
client.publish("/jc/feed/log", (feed_motor.get_position() - 188) * 90 / 1024)
|
||||
time.sleep(1) # Adjust the sleep time as needed
|
||||
|
||||
# Start the continuous log reporting in a separate thread
|
||||
log_thread = threading.Thread(target=continuous_log_reporting)
|
||||
log_thread.daemon = True
|
||||
log_thread.start()
|
||||
|
||||
|
||||
client = mqtt.Client()
|
||||
client.on_connect = on_connect
|
||||
client.on_message = on_message
|
||||
|
||||
# Connect to the broker
|
||||
client.connect("192.168.1.1", 1883, 60)
|
||||
|
||||
# Blocking call that processes network traffic, dispatches callbacks and
|
||||
# handles reconnecting.
|
||||
client.loop_forever()
|
||||
|
|
@ -0,0 +1,15 @@
|
|||
[Unit]
|
||||
Description=MQTT Listener Service
|
||||
After=network.target
|
||||
|
||||
[Service]
|
||||
ExecStart=/home/biqu/mqtt_start.sh
|
||||
WorkingDirectory=/home/biqu
|
||||
StandardOutput=inherit
|
||||
StandardError=inherit
|
||||
Restart=always
|
||||
User=biqu
|
||||
|
||||
[Install]
|
||||
WantedBy=multi-user.target
|
||||
|
|
@ -0,0 +1,10 @@
|
|||
#!/bin/bash
|
||||
|
||||
# navigate to the directory of the script
|
||||
cd /home/biqu/screw_control/
|
||||
|
||||
# activate the python environment, if you're using one
|
||||
# source /path_to_your_venv/bin/activate
|
||||
|
||||
# run the script
|
||||
/usr/bin/python3 mqtt_listener.py
|
Loading…
Reference in New Issue