diff --git a/README.md b/README.md new file mode 100644 index 0000000..ff13855 --- /dev/null +++ b/README.md @@ -0,0 +1,7 @@ +# To install on robot + +``` +git clone +cd lewis-crawler/crawler_software/raspberry_pi +make install? +``` diff --git a/companion_software/BasicBot.py b/companion_software/BasicBot.py new file mode 100644 index 0000000..d06675a --- /dev/null +++ b/companion_software/BasicBot.py @@ -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 + diff --git a/crawler_software/arduino/crawler_slave/crawler_slave.ino b/crawler_software/arduino/crawler_slave/crawler_slave.ino new file mode 100644 index 0000000..dee8522 --- /dev/null +++ b/crawler_software/arduino/crawler_slave/crawler_slave.ino @@ -0,0 +1,63 @@ +/* Crawler Slave + * + * This code runs on the crawler i2c network + * and provides a cleaner, less CPU intensive control over PWM devices. + */ + +#include +#include + +// 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); + break; + } + } + + // Prevents a bug where if bytes are left in buffer, arduino crashes. + while (Wire.available()) { + Wire.read(); + } +} diff --git a/crawler_software/config/hardware.yaml b/crawler_software/raspberry_pi/config/hardware.yaml similarity index 100% rename from crawler_software/config/hardware.yaml rename to crawler_software/raspberry_pi/config/hardware.yaml diff --git a/crawler_software/raspberry_pi/crawler.service b/crawler_software/raspberry_pi/crawler.service new file mode 100644 index 0000000..e3fcca5 --- /dev/null +++ b/crawler_software/raspberry_pi/crawler.service @@ -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 diff --git a/crawler_software/raspberry_pi/requirements.txt b/crawler_software/raspberry_pi/requirements.txt new file mode 100644 index 0000000..187c797 --- /dev/null +++ b/crawler_software/raspberry_pi/requirements.txt @@ -0,0 +1,2 @@ +PySSTV +picamera diff --git a/photos/TEST_PATTERN.jpg b/crawler_software/raspberry_pi/resources/TEST_PATTERN.jpg similarity index 100% rename from photos/TEST_PATTERN.jpg rename to crawler_software/raspberry_pi/resources/TEST_PATTERN.jpg diff --git a/crawler_software/sstv.py b/crawler_software/raspberry_pi/sstv.py similarity index 100% rename from crawler_software/sstv.py rename to crawler_software/raspberry_pi/sstv.py diff --git a/crawler_software/raspberry_pi/tests/discordbot.py b/crawler_software/raspberry_pi/tests/discordbot.py new file mode 100644 index 0000000..9ad51e6 --- /dev/null +++ b/crawler_software/raspberry_pi/tests/discordbot.py @@ -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 + diff --git a/crawler_software/servo_test.py b/crawler_software/raspberry_pi/tests/servo_test.py similarity index 100% rename from crawler_software/servo_test.py rename to crawler_software/raspberry_pi/tests/servo_test.py diff --git a/crawler_software/raspberry_pi/tests/stack_overflow.py b/crawler_software/raspberry_pi/tests/stack_overflow.py new file mode 100644 index 0000000..38e1d7a --- /dev/null +++ b/crawler_software/raspberry_pi/tests/stack_overflow.py @@ -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") diff --git a/crawler_software/raspberry_pi/tests/test_i2c.py b/crawler_software/raspberry_pi/tests/test_i2c.py new file mode 100644 index 0000000..96bf7f3 --- /dev/null +++ b/crawler_software/raspberry_pi/tests/test_i2c.py @@ -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 diff --git a/crawler_software/raspberry_pi/tests/test_tx.py b/crawler_software/raspberry_pi/tests/test_tx.py new file mode 100644 index 0000000..747b9ed --- /dev/null +++ b/crawler_software/raspberry_pi/tests/test_tx.py @@ -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 diff --git a/working/working.jpg b/crawler_software/raspberry_pi/working/working.jpg similarity index 100% rename from working/working.jpg rename to crawler_software/raspberry_pi/working/working.jpg diff --git a/photos/TEST_PATTERN.jpg.kra b/photos/TEST_PATTERN.jpg.kra deleted file mode 100644 index 7028117..0000000 Binary files a/photos/TEST_PATTERN.jpg.kra and /dev/null differ diff --git a/photos/camera_latest.jpg b/photos/camera_latest.jpg deleted file mode 100644 index 7ffc30e..0000000 Binary files a/photos/camera_latest.jpg and /dev/null differ diff --git a/requirements.txt b/requirements.txt deleted file mode 100644 index 7ecfacd..0000000 --- a/requirements.txt +++ /dev/null @@ -1,2 +0,0 @@ -PySSTV -picamera \ No newline at end of file