Compare commits
80 Commits
a948335e65
...
develop
| Author | SHA1 | Date | |
|---|---|---|---|
| 5c945e43b5 | |||
| dc3bc85607 | |||
| 0d06a71fca | |||
| 5f9ea8867c | |||
| b42055bd4b | |||
| 7ea7f13e9b | |||
| 9bb1cf2055 | |||
| 151853b1d3 | |||
| 6106c46bd8 | |||
| 5062ada35a | |||
| c2d9fb20d7 | |||
| cadc2b0c6a | |||
| a234275422 | |||
| c67bcdc484 | |||
| 61d77870a0 | |||
| ea5978f4e4 | |||
| 942809c95a | |||
| 598e84603f | |||
| c2695e1971 | |||
| af4c8f978b | |||
| 046c1f7846 | |||
| 6fbb53b6bd | |||
| f6bb087799 | |||
| 21330c945d | |||
| b5ba5f6f9e | |||
| 32bd0f5b55 | |||
| 13eb27b9c3 | |||
| f34cb81c7a | |||
| 209e15d41f | |||
| de214dfc6b | |||
| 8f7e12ec90 | |||
| 03564ed485 | |||
| 19acde6d43 | |||
| d2f85f6aad | |||
| 6f1e5af90f | |||
| 2ee6bbef90 | |||
| 941b5ac4e8 | |||
| 779127ff73 | |||
| 9e58b2b1af | |||
| 227815ac32 | |||
| 83a33cc202 | |||
| aa575f67a3 | |||
| b902f8a500 | |||
| f38f1ab8ba | |||
| e092a570d1 | |||
| 3c0ecdd98c | |||
| 041bde458c | |||
| 67daffd667 | |||
| acc5bffb71 | |||
| c0b5d40653 | |||
| db52dbff47 | |||
| 6a74fcb472 | |||
| e8dd3c3fe9 | |||
| 9f0fb82831 | |||
| 049b1a7c5c | |||
| d12c7b64ed | |||
| 8fede6107b | |||
| 75cb115330 | |||
| c2439c8fa1 | |||
| 7cc49a0406 | |||
| f1696dd006 | |||
| 6fd0c249a0 | |||
| 66dfa763d2 | |||
| 3bde28770c | |||
| 4dcb454067 | |||
| 218626d316 | |||
| f9a47e8891 | |||
| c0ec0d141e | |||
| e414f63425 | |||
| 513fe74228 | |||
| 1e98970dc3 | |||
| d13b74ed47 | |||
| 8dcbaded2d | |||
| fe1c4cf389 | |||
| 3ce68231eb | |||
| c33d4c0350 | |||
| 81c442f656 | |||
| f9c7676c92 | |||
| d6e481866a | |||
| 87ec24a074 |
7
.gitignore
vendored
7
.gitignore
vendored
@@ -1,7 +1,14 @@
|
|||||||
# Python
|
# Python
|
||||||
__pycache__
|
__pycache__
|
||||||
|
Pipfile
|
||||||
|
Pipfile.lock
|
||||||
|
|
||||||
# CAD
|
# CAD
|
||||||
*.stl
|
*.stl
|
||||||
*.FCStd1
|
*.FCStd1
|
||||||
|
|
||||||
|
# Artifacts
|
||||||
|
*.png
|
||||||
|
*.jpg
|
||||||
|
*.wav
|
||||||
|
*.pdf
|
||||||
|
|||||||
Binary file not shown.
Binary file not shown.
19
README.md
Normal file
19
README.md
Normal file
@@ -0,0 +1,19 @@
|
|||||||
|
# To install on robot
|
||||||
|
|
||||||
|
```
|
||||||
|
git clone https://kitsunehosting.net/gitea/Kenwood/lewis-crawler /srv/crawler
|
||||||
|
cd /srv/crawler/crawler_software/raspberry_pi
|
||||||
|
make install
|
||||||
|
```
|
||||||
|
|
||||||
|
# Updating
|
||||||
|
|
||||||
|
```
|
||||||
|
cd /srv/crawler
|
||||||
|
git pull
|
||||||
|
```
|
||||||
|
|
||||||
|
|
||||||
|
# Notes
|
||||||
|
|
||||||
|
[Uart Stuff](https://www.reddit.com/r/raspberry_pi/comments/833qux/binary_file_tranfer_via_uart/)
|
||||||
23
companion_software/BasicBot.py
Normal file
23
companion_software/BasicBot.py
Normal file
@@ -0,0 +1,23 @@
|
|||||||
|
from discord_webhook import DiscordWebhook
|
||||||
|
from picamera import PiCamera
|
||||||
|
from time import sleep
|
||||||
|
|
||||||
|
|
||||||
|
def get_uptime():
|
||||||
|
with open('/proc/uptime', 'r') as f:
|
||||||
|
uptime_seconds = float(f.readline().split()[0])
|
||||||
|
|
||||||
|
return uptime_seconds
|
||||||
|
|
||||||
|
webhookURL = "https://discord.com/api/webhooks/856609966404534272/TR9tnLq2sIGZoOeADNswmGRNlzBcqM5aKihfU6snVTP9WhSSoVVvi7nT6i-ZfZS7Hcqm"
|
||||||
|
|
||||||
|
webhook = DiscordWebhook(url=webhookURL, content="Uptime: " + str( round( ((get_uptime() / 60) / 60 ), 2 )) + " hours")
|
||||||
|
|
||||||
|
camera = PiCamera()
|
||||||
|
sleep(3) # let iso settle out
|
||||||
|
camera.capture('still.jpg')
|
||||||
|
|
||||||
|
with open("still.jpg", "rb") as f:
|
||||||
|
webhook.add_file(file=f.read(), filename='still.jpg')
|
||||||
|
response = webhook.execute() # Hit send
|
||||||
|
|
||||||
BIN
crawler_cad/DigiCase/Digi Case Base.FCStd
Normal file
BIN
crawler_cad/DigiCase/Digi Case Base.FCStd
Normal file
Binary file not shown.
BIN
crawler_cad/DigiCase/Digi Case Lid.FCStd
Normal file
BIN
crawler_cad/DigiCase/Digi Case Lid.FCStd
Normal file
Binary file not shown.
5031
crawler_cad/External/Bed_moto.obj
vendored
Normal file
5031
crawler_cad/External/Bed_moto.obj
vendored
Normal file
File diff suppressed because it is too large
Load Diff
BIN
crawler_cad/External/bed_Moto.FCStd
vendored
Normal file
BIN
crawler_cad/External/bed_Moto.FCStd
vendored
Normal file
Binary file not shown.
BIN
crawler_cad/Frame.FCStd
Normal file
BIN
crawler_cad/Frame.FCStd
Normal file
Binary file not shown.
BIN
crawler_cad/MastCam/9gServo.FCStd
Normal file
BIN
crawler_cad/MastCam/9gServo.FCStd
Normal file
Binary file not shown.
BIN
crawler_cad/MastCam/MastCamFace.FCStd
Normal file
BIN
crawler_cad/MastCam/MastCamFace.FCStd
Normal file
Binary file not shown.
BIN
crawler_cad/MastCam/MastCamMount.FCStd
Normal file
BIN
crawler_cad/MastCam/MastCamMount.FCStd
Normal file
Binary file not shown.
BIN
crawler_cad/MastCam/MastCamRear.FCStd
Normal file
BIN
crawler_cad/MastCam/MastCamRear.FCStd
Normal file
Binary file not shown.
BIN
crawler_cad/MastCam/Window Wiper.FCStd
Normal file
BIN
crawler_cad/MastCam/Window Wiper.FCStd
Normal file
Binary file not shown.
BIN
crawler_cad/lewis-crawler.FCStd
Normal file
BIN
crawler_cad/lewis-crawler.FCStd
Normal file
Binary file not shown.
38
crawler_software/arduino/crawler_slave/Makefile
Normal file
38
crawler_software/arduino/crawler_slave/Makefile
Normal file
@@ -0,0 +1,38 @@
|
|||||||
|
# A makefile for building the robot's slave software
|
||||||
|
# Uses arduino-cli
|
||||||
|
#
|
||||||
|
# Kitsune Scientific 2021
|
||||||
|
|
||||||
|
# What board to build for and its core
|
||||||
|
CORE ?= arduino:avr
|
||||||
|
FQBN ?= arduino:avr:nano:cpu=atmega328old
|
||||||
|
|
||||||
|
# What port to build on
|
||||||
|
ifndef SERIAL_DEV
|
||||||
|
ifneq (,$(wildcard /dev/ttyUSB0))
|
||||||
|
SERIAL_DEV = /dev/ttyUSB0
|
||||||
|
else ifneq (,$(wildcard /dev/ttyACM0))
|
||||||
|
SERIAL_DEV = /dev/ttyACM0
|
||||||
|
else
|
||||||
|
SERIAL_DEV = unknown
|
||||||
|
endif
|
||||||
|
endif
|
||||||
|
|
||||||
|
all: requirements build upload
|
||||||
|
|
||||||
|
build: requirements crawler_slave.ino
|
||||||
|
arduino-cli core install $(CORE)
|
||||||
|
|
||||||
|
arduino-cli compile -b $(FQBN) crawler_slave
|
||||||
|
|
||||||
|
upload: requirements crawler_slave.ino
|
||||||
|
arduino-cli upload -b $(FQBN) crawler_slave -p $(SERIAL_DEV)
|
||||||
|
|
||||||
|
requirements:
|
||||||
|
@if [ -e requirements.txt ]; \
|
||||||
|
then while read -r i ; do echo ; \
|
||||||
|
echo "---> Installing " '"'$$i'"' ; \
|
||||||
|
arduino-cli lib install "$$i" ; \
|
||||||
|
done < requirements.txt ; \
|
||||||
|
else echo "---> MISSING requirements.txt file"; \
|
||||||
|
fi
|
||||||
65
crawler_software/arduino/crawler_slave/crawler_slave.ino
Normal file
65
crawler_software/arduino/crawler_slave/crawler_slave.ino
Normal file
@@ -0,0 +1,65 @@
|
|||||||
|
/* Crawler Slave
|
||||||
|
*
|
||||||
|
* This code runs on the crawler i2c network
|
||||||
|
* and provides a cleaner, less CPU intensive control over PWM devices.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include <Wire.h>
|
||||||
|
#include <Servo.h>
|
||||||
|
|
||||||
|
// This servo is used to wipe and clean the camera lens
|
||||||
|
Servo windowWiperServo;
|
||||||
|
|
||||||
|
// Variables populated over i2c from master
|
||||||
|
int id;
|
||||||
|
int val;
|
||||||
|
|
||||||
|
void setup() {
|
||||||
|
// For debugging
|
||||||
|
//Serial.begin(115200);
|
||||||
|
|
||||||
|
// Attach the wiper servo to pin 9
|
||||||
|
windowWiperServo.attach(9);
|
||||||
|
|
||||||
|
// This is the address the pi will speak to us at
|
||||||
|
Wire.begin(0x4);
|
||||||
|
|
||||||
|
// Call receiveEvent when data received
|
||||||
|
Wire.onReceive(receiveEvent);
|
||||||
|
|
||||||
|
// Setup LED
|
||||||
|
pinMode(LED_BUILTIN, OUTPUT);
|
||||||
|
digitalWrite(LED_BUILTIN, LOW);
|
||||||
|
|
||||||
|
//Serial.println("Started");
|
||||||
|
}
|
||||||
|
|
||||||
|
// Just loop to keep the running code alive, and wait for events to happen.
|
||||||
|
void loop() {
|
||||||
|
delay(50);
|
||||||
|
}
|
||||||
|
|
||||||
|
// This method runs when we receive a message
|
||||||
|
void receiveEvent(int n) {
|
||||||
|
Wire.read(); // Remove smbus trash
|
||||||
|
if (true) { // Dont do anything if this is not true
|
||||||
|
id = Wire.read(); // ID of the servo/device to access
|
||||||
|
val = Wire.read(); // Value to assign
|
||||||
|
|
||||||
|
//Serial.println(id);
|
||||||
|
//Serial.println(val);
|
||||||
|
|
||||||
|
switch(id) {
|
||||||
|
case 1:
|
||||||
|
windowWiperServo.write(val); // Set a val
|
||||||
|
delay(5); // pause for a moment
|
||||||
|
windowWiperServo.detach(); // Detach (stop moving) the servo
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// Prevents a bug where if bytes are left in buffer, arduino crashes.
|
||||||
|
while (Wire.available()) {
|
||||||
|
Wire.read();
|
||||||
|
}
|
||||||
|
}
|
||||||
1
crawler_software/arduino/crawler_slave/requirements.txt
Normal file
1
crawler_software/arduino/crawler_slave/requirements.txt
Normal file
@@ -0,0 +1 @@
|
|||||||
|
Servo
|
||||||
18
crawler_software/raspberry_pi/Makefile
Normal file
18
crawler_software/raspberry_pi/Makefile
Normal file
@@ -0,0 +1,18 @@
|
|||||||
|
# A makefile for installing the robot's python
|
||||||
|
# software and setting it up.
|
||||||
|
#
|
||||||
|
# Requires sudo
|
||||||
|
#
|
||||||
|
# Kitsune Scientific 2021
|
||||||
|
|
||||||
|
all: install
|
||||||
|
|
||||||
|
upload: crawler.service
|
||||||
|
sudo cp crawler.service /etc/systemd/system/crawler.service
|
||||||
|
|
||||||
|
sudo systemctl daemon-reload
|
||||||
|
|
||||||
|
sudo systemctl enable crawler.service
|
||||||
|
sudo systemctl start crawler.service
|
||||||
|
|
||||||
|
sudo systemctl status crawler
|
||||||
5
crawler_software/raspberry_pi/config/hardware.yaml
Normal file
5
crawler_software/raspberry_pi/config/hardware.yaml
Normal file
@@ -0,0 +1,5 @@
|
|||||||
|
wiper_servo:
|
||||||
|
pin: 17
|
||||||
|
min_pulse: 0.000544
|
||||||
|
max_pulse: 0.0024
|
||||||
|
|
||||||
11
crawler_software/raspberry_pi/crawler.service
Normal file
11
crawler_software/raspberry_pi/crawler.service
Normal file
@@ -0,0 +1,11 @@
|
|||||||
|
[Unit]
|
||||||
|
Description=Crawler service overseer, manages running main crawler software
|
||||||
|
After=multi-user.target
|
||||||
|
|
||||||
|
[Service]
|
||||||
|
Type=simple
|
||||||
|
Restart=always
|
||||||
|
ExecStart=/usr/bin/python /srv/crawler/crawler.py
|
||||||
|
|
||||||
|
[Install]
|
||||||
|
WantedBy=multi-user.target
|
||||||
2
crawler_software/raspberry_pi/requirements.txt
Normal file
2
crawler_software/raspberry_pi/requirements.txt
Normal file
@@ -0,0 +1,2 @@
|
|||||||
|
PySSTV
|
||||||
|
picamera
|
||||||
|
Before Width: | Height: | Size: 13 KiB After Width: | Height: | Size: 13 KiB |
@@ -1,9 +1,15 @@
|
|||||||
from shutil import copyfile
|
from shutil import copyfile
|
||||||
from PIL import Image, ImageFont, ImageDraw
|
from PIL import Image, ImageFont, ImageDraw
|
||||||
from pysstv import color
|
from pysstv import color
|
||||||
from picamera import PiCamera
|
|
||||||
import logging as log
|
import logging as log
|
||||||
|
|
||||||
|
try:
|
||||||
|
from picamera import PiCamera
|
||||||
|
except ModuleNotFoundError:
|
||||||
|
log.info("Running in simulator mode")
|
||||||
|
|
||||||
|
|
||||||
def take_photo():
|
def take_photo():
|
||||||
# This def is meant to take a photograph from the robot,
|
# This def is meant to take a photograph from the robot,
|
||||||
# it should include all steps and error checking to raise the mast
|
# it should include all steps and error checking to raise the mast
|
||||||
@@ -16,9 +22,12 @@ def take_photo():
|
|||||||
# Software to take the photo should be here
|
# Software to take the photo should be here
|
||||||
#copyfile('photos/camera_latest.jpg', 'working/working.jpg')
|
#copyfile('photos/camera_latest.jpg', 'working/working.jpg')
|
||||||
log.debug('Initalizing camera.')
|
log.debug('Initalizing camera.')
|
||||||
camera = PiCamera()
|
try:
|
||||||
log.info('Saving photo.')
|
camera = PiCamera()
|
||||||
camera.capture('working/working.jpg')
|
log.info('Saving photo.')
|
||||||
|
camera.capture('working/working.jpg')
|
||||||
|
except NameError:
|
||||||
|
log.info("Running in simulator mode, not replacing test pattern")
|
||||||
|
|
||||||
def mark_photo():
|
def mark_photo():
|
||||||
log.info('Opening photo for viewing.')
|
log.info('Opening photo for viewing.')
|
||||||
@@ -0,0 +1,16 @@
|
|||||||
|
from PIL import Image
|
||||||
|
import base64
|
||||||
|
|
||||||
|
im = Image.open('still.jpg')
|
||||||
|
|
||||||
|
# using Image.ADAPTIVE to avoid dithering
|
||||||
|
for i in range(8, 0, -1):
|
||||||
|
out = im.convert('P', palette=Image.ADAPTIVE, colors=i)
|
||||||
|
|
||||||
|
out.save(f'out_{i}_bits.png')
|
||||||
|
|
||||||
|
with open(f'out_{i}_bits.png', 'rb') as image_file:
|
||||||
|
encoded_string = base64.a85encode(image_file.read())
|
||||||
|
|
||||||
|
with open(f'out_{i}_bits.txt', 'w') as f:
|
||||||
|
f.write(encoded_string.decode('UTF-8'))
|
||||||
@@ -0,0 +1 @@
|
|||||||
|
M,6r;%14!\!!!!.8Ou6I!!!)I!!!&X#Qk&,!4s2MScA`m!)Q?g7AGd(zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz!.5pZZiC(+%V8a6Akbu".KBGK#QOi)zdSl>0!!-\'6pXdsSF+-I!<<*"_P$QtD$r"izzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz!!!"D(e?.W!V_LqE<#t=!(fUS7'8jaJc
|
||||||
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
73
crawler_software/raspberry_pi/tests/discordbot.py
Normal file
73
crawler_software/raspberry_pi/tests/discordbot.py
Normal file
@@ -0,0 +1,73 @@
|
|||||||
|
from discord_webhook import DiscordWebhook
|
||||||
|
from picamera import PiCamera
|
||||||
|
from time import sleep
|
||||||
|
from gps import *
|
||||||
|
from smbus import SMBus
|
||||||
|
import time
|
||||||
|
|
||||||
|
addr = 0x4 # bus address
|
||||||
|
bus = SMBus(1) # indicates /dev/ic2-1
|
||||||
|
|
||||||
|
numb = 1
|
||||||
|
|
||||||
|
def writeData(value):
|
||||||
|
byteValue = StringToBytes(value)
|
||||||
|
bus.write_i2c_block_data(addr,0x00,byteValue) #first byte is 0=command byte.. just is.
|
||||||
|
return -1
|
||||||
|
|
||||||
|
|
||||||
|
def StringToBytes(val):
|
||||||
|
retVal = []
|
||||||
|
for c in val:
|
||||||
|
retVal.append(ord(c))
|
||||||
|
return retVal
|
||||||
|
|
||||||
|
try:
|
||||||
|
for _x in range (0, 2):
|
||||||
|
for i in range(78, 130):
|
||||||
|
writeData("WIPE-" + str(i))
|
||||||
|
time.sleep(0.02)
|
||||||
|
for i in range(130, 78, -1):
|
||||||
|
writeData("WIPE-" + str(i))
|
||||||
|
time.sleep(0.02)
|
||||||
|
except OSError:
|
||||||
|
print("Could not speak to ardujmemo")
|
||||||
|
|
||||||
|
def get_uptime():
|
||||||
|
with open('/proc/uptime', 'r') as f:
|
||||||
|
uptime_seconds = float(f.readline().split()[0])
|
||||||
|
|
||||||
|
return uptime_seconds
|
||||||
|
|
||||||
|
def getPositionData(gps):
|
||||||
|
location = [None]
|
||||||
|
while(location[0] == None):
|
||||||
|
print("Trying again")
|
||||||
|
nx = gpsd.next()
|
||||||
|
# For a list of all supported classes and fields refer to:
|
||||||
|
# https://gpsd.gitlab.io/gpsd/gpsd_json.html
|
||||||
|
if nx['class'] == 'TPV':
|
||||||
|
latitude = getattr(nx,'lat', "Unknown")
|
||||||
|
longitude = getattr(nx,'lon', "Unknown")
|
||||||
|
#print "Your position: lon = " + str(longitude) + ", lat = " + str(latitude)
|
||||||
|
location = [latitude, longitude]
|
||||||
|
return location
|
||||||
|
|
||||||
|
gpsd = gps(mode=WATCH_ENABLE|WATCH_NEWSTYLE)
|
||||||
|
|
||||||
|
loc = getPositionData(gpsd)
|
||||||
|
|
||||||
|
webhookURL = "https://discord.com/api/webhooks/856609966404534272/TR9tnLq2sIGZoOeADNswmGRNlzBcqM5aKihfU6snVTP9WhSSoVVvi7nT6i-ZfZS7Hcqm"
|
||||||
|
|
||||||
|
print(loc[0])
|
||||||
|
print(loc[1])
|
||||||
|
webhook = DiscordWebhook(url=webhookURL, content="Uptime: " + str( round( ((get_uptime() / 60) / 60 ), 2 )) + " hours. Lat is " + str(loc[0]) + ", long is " + str(loc[1]))
|
||||||
|
|
||||||
|
camera = PiCamera()
|
||||||
|
sleep(3) # let iso settle out
|
||||||
|
camera.capture('still.jpg')
|
||||||
|
|
||||||
|
with open("still.jpg", "rb") as f:
|
||||||
|
webhook.add_file(file=f.read(), filename='still.jpg')
|
||||||
|
response = webhook.execute() # Hit send
|
||||||
|
|
||||||
25
crawler_software/raspberry_pi/tests/otp/otp_test.py
Normal file
25
crawler_software/raspberry_pi/tests/otp/otp_test.py
Normal file
@@ -0,0 +1,25 @@
|
|||||||
|
from random import randrange
|
||||||
|
import time, pyotp, datetime
|
||||||
|
|
||||||
|
hotp = pyotp.HOTP(pyotp.random_base32())
|
||||||
|
|
||||||
|
success = 0
|
||||||
|
num_tries = 20
|
||||||
|
|
||||||
|
for i in range(0,num_tries):
|
||||||
|
epoch = int(time.time())
|
||||||
|
code = hotp.at(epoch)
|
||||||
|
print('------------------------')
|
||||||
|
print(f'Made a code {code} at {epoch}, sending a simualted instruction')
|
||||||
|
|
||||||
|
waittime = randrange(5)
|
||||||
|
print(f'Instuction will take {waittime} seconds to receive or be recieved')
|
||||||
|
time.sleep(waittime)
|
||||||
|
|
||||||
|
if hotp.verify(code, epoch):
|
||||||
|
print(f'code:{code} verified')
|
||||||
|
success += 1
|
||||||
|
else:
|
||||||
|
print(f'code:{code} expired')
|
||||||
|
|
||||||
|
print(f'Succeded {success} out of {num_tries} tries')
|
||||||
19
crawler_software/raspberry_pi/tests/servo_test.py
Normal file
19
crawler_software/raspberry_pi/tests/servo_test.py
Normal file
@@ -0,0 +1,19 @@
|
|||||||
|
import RPi.GPIO as GPIO
|
||||||
|
import time
|
||||||
|
|
||||||
|
servoPIN = 17
|
||||||
|
GPIO.setmode(GPIO.BCM)
|
||||||
|
GPIO.setup(servoPIN, GPIO.OUT)
|
||||||
|
|
||||||
|
p = GPIO.PWM(servoPIN, 50) # GPIO 17 for PWM with 50Hz
|
||||||
|
p.start(2.5) # Initialization
|
||||||
|
try:
|
||||||
|
while True:
|
||||||
|
p.ChangeDutyCycle(10)
|
||||||
|
time.sleep(2)
|
||||||
|
p.ChangeDutyCycle(2.5)
|
||||||
|
time.sleep(2)
|
||||||
|
except KeyboardInterrupt:
|
||||||
|
p.stop()
|
||||||
|
GPIO.cleanup()
|
||||||
|
|
||||||
20
crawler_software/raspberry_pi/tests/stack_overflow.py
Normal file
20
crawler_software/raspberry_pi/tests/stack_overflow.py
Normal file
@@ -0,0 +1,20 @@
|
|||||||
|
import smbus
|
||||||
|
import time
|
||||||
|
import struct
|
||||||
|
|
||||||
|
# for RPI version 1, use bus = smbus.SMBus(0)
|
||||||
|
bus = smbus.SMBus(1)
|
||||||
|
|
||||||
|
# This is the address we setup in the Arduino Program
|
||||||
|
address = 0x04
|
||||||
|
|
||||||
|
try:
|
||||||
|
for _x in range (0, 2):
|
||||||
|
for i in range(78, 130):
|
||||||
|
bus.write_i2c_block_data(address, 0, [1, i])
|
||||||
|
time.sleep(0.02)
|
||||||
|
for i in range(130, 78, -1):
|
||||||
|
bus.write_i2c_block_data(address, 0, [1, i])
|
||||||
|
time.sleep(0.02)
|
||||||
|
except OSError:
|
||||||
|
print("Could not speak to ardujmemo")
|
||||||
35
crawler_software/raspberry_pi/tests/test_i2c.py
Normal file
35
crawler_software/raspberry_pi/tests/test_i2c.py
Normal file
@@ -0,0 +1,35 @@
|
|||||||
|
# Raspberry Pi Master for Arduino Slave
|
||||||
|
# i2c_master_pi.py
|
||||||
|
# Connects to Arduino via I2C
|
||||||
|
|
||||||
|
# DroneBot Workshop 2019
|
||||||
|
# https://dronebotworkshop.com
|
||||||
|
|
||||||
|
from smbus import SMBus
|
||||||
|
import time
|
||||||
|
|
||||||
|
addr = 0x8 # bus address
|
||||||
|
bus = SMBus(1) # indicates /dev/ic2-1
|
||||||
|
|
||||||
|
numb = 1
|
||||||
|
|
||||||
|
print ("Enter num")
|
||||||
|
|
||||||
|
for _x in range (0, 4):
|
||||||
|
for i in range(76, 130):
|
||||||
|
bus.write_byte(addr, i)
|
||||||
|
time.sleep(0.02)
|
||||||
|
for i in range(130, 76, -1):
|
||||||
|
bus.write_byte(addr, i)
|
||||||
|
time.sleep(0.02)
|
||||||
|
|
||||||
|
#while numb == 1:
|
||||||
|
#
|
||||||
|
# ledstate = input(">>>> ")
|
||||||
|
#
|
||||||
|
# if ledstate == "1":
|
||||||
|
# bus.write_byte(addr, 0x1) # switch it on
|
||||||
|
# elif ledstate == "0":
|
||||||
|
# bus.write_byte(addr, 0x0) # switch it on
|
||||||
|
# else:
|
||||||
|
# numb = 0
|
||||||
12
crawler_software/raspberry_pi/tests/test_tx.py
Normal file
12
crawler_software/raspberry_pi/tests/test_tx.py
Normal file
@@ -0,0 +1,12 @@
|
|||||||
|
import RPi.GPIO as GPIO # Import Raspberry Pi GPIO library
|
||||||
|
from time import sleep # Import the sleep function from the time module
|
||||||
|
|
||||||
|
GPIO.setwarnings(False) # Ignore warning for now
|
||||||
|
GPIO.setmode(GPIO.BOARD) # Use physical pin numbering
|
||||||
|
GPIO.setup(12, GPIO.OUT, initial=GPIO.LOW) # Set pin 8 to be an output pin and set initial value to low (off)
|
||||||
|
|
||||||
|
while True: # Run forever
|
||||||
|
GPIO.output(12, GPIO.HIGH) # Turn on
|
||||||
|
sleep(1) # Sleep for 1 second
|
||||||
|
GPIO.output(12, GPIO.LOW) # Turn off
|
||||||
|
sleep(1) # Sleep for 1 second
|
||||||
|
Before Width: | Height: | Size: 4.7 KiB After Width: | Height: | Size: 4.7 KiB |
Binary file not shown.
Binary file not shown.
|
Before Width: | Height: | Size: 86 KiB |
@@ -1,2 +0,0 @@
|
|||||||
PySSTV
|
|
||||||
picamera
|
|
||||||
Reference in New Issue
Block a user