Stap 3: De software
Im ' using Raspian OS, gewoon de standaard downloaden vanaf de website van raspberry pi.
Het verzamelen van alle beelden, ben ik met behulp van een centraal bestandsserver (in mijn geval gebruik ik een Qnap). Ik geconfigureerd de raspbian afbeelding op de bestandsserver op. hiervoor gebruikt cifs aansluiten. Dit wordt gedaan in het bestand/etc/fstab.
Ik ben ook met behulp van de centrale bestandsserver op te slaan mijn software, zodat ik wijzigingen aanbrengen kunt zonder het moeten bijwerken van elke framboos op zijn eigen.
Nadat ik dit beeld, gebruikte ik dd (op mijn mac) om een kloon van de SD kaart 40 x voor elke framboos.
Ik wilde een "luisteren" script schrijven dat elke framboos lopen zou, luisteren naar een bepaald netwerk uitzenden pakket dat zou leiden tot de camera en vervolgens opslaan van de foto en kopieer deze naar de bestandsserver. Als ik wil alle afbeeldingen worden opgeslagen in een map (een map per schot), ben ik met behulp van het lokale IP-adres van elke framboos (de laatste 3 cijfers) voor een voorvoegsel van de bestandsnaam.
Hier de python luisteren script die ik gebruik:
#! / usr/bin/python
invoer aansluiting
struct importeren
fcntl importeren
een subproces voor importeren
importeren van sys
MCAST_GRP = '224.1.1.1'
MCAST_PORT = 5007
sock = socket.socket (socket.AF_INET, socket. SOCK_DGRAM, socket. IPPROTO_UDP)
sock.setsockopt (aansluiting. SOL_SOCKET, socket. SO_REUSEADDR, 1)
sock.bind (('', MCAST_PORT))
mreq = struct.pack ("4sl", socket.inet_aton(MCAST_GRP), socket. INADDR_ANY)
sock.setsockopt (aansluiting. IPPROTO_IP, socket. IP_ADD_MEMBERSHIP, mreq)
def get_ip_address(ifname):
s = socket.socket (socket.AF_INET, socket. SOCK_DGRAM)
keren socket.inet_ntoa (fcntl.ioctl)
s.fileno(),
0X8915, # SIOCGIFADDR
struct.Pack ('256s ', ifname[:15])
[20:24]))
id = get_ip_address('eth0')
IP1, ip2, ip3, ip4 = id.split('.')
afdrukken ' ID: ' + ip4
#create een options bestand, dit bestand moeten containt de parameters voor de raspistill afbeelding cmd
optionfile = open('/server/options.cfg','r')
opties = optionfile.readline()
optionfile.Close()
afdrukken "optons:" + opties
terwijl juist:
gegevens = sock.recv(10240)
gegevens = data.strip()
Als gegevens == "reboot":
afdrukken "herstart..."
cmd = "sudo reboot"
PID = subprocess.call (cmd, shell = True)
anders:
"schieten" + gegevens afdrukken
cmd = 'raspistill -o /tmp/photo.jpg' + opties
PID = subprocess.call (cmd, shell = True)
Print "maken directory"
cmd = ' mkdir/server/3dscan /' + gegevens
PID = subprocess.call (cmd, shell = True)
afdrukken "afbeelding kopiëren"
cmd = 'cp /tmp/photo.jpg/server/3dscan /' + data + "/" + data + "_" + ip4 + '.jpg'
PID = subprocess.call (cmd, shell = True)
Print "Foto geüpload"
Om te beginnen alle de frambozen om een foto te maken, heb ik een script"verzenden". Dat zou vragen om een naam. Deze naam wordt verzonden naar de frambozen in het voorvoegsel van de bestandsnaam op te nemen. Dus ik wie de beelden zijn weet van.
Hier sturen de python script:
invoer aansluiting
importeren van sys
importeren
afdrukken ' foto naam:'
n = sys.stdin.readline()
n = n.strip('\n')
MCAST_GRP = '224.1.1.1'
MCAST_PORT = 5007
sock = socket.socket (socket.AF_INET, socket. SOCK_DGRAM, socket. IPPROTO_UDP)
sock.setsockopt (aansluiting. IPPROTO_IP, socket. IP_MULTICAST_TTL, 2)
sock.sendto (n, (MCAST_GRP, MCAST_PORT))
Het luisteren script controleert de naam ontvangen. Als de naam opnieuw opstarten, opnieuw laden of opnieuw opstarten doet het een speciale actie, in plaats van een foto te schieten.
Als u wilt configureren welke opties die ik wil gebruiken voor raspistill (de standaard afbeelding capture software op de framboos voor de PI-camera) ben ik met behulp van een options.cfg-bestand configureren dit. Opnieuw wordt dit opgeslagen op de centrale server, dus ik gemakkelijk de opties veranderen kan.
Ik heb een aantal testen om te zien hoe in-sync alle de framboos taarten zou het nemen van de foto. Aangezien zij allen het netwerk uitzenden pakket op precies hetzelfde moment ontvangen, vond ik dit werkte prima. Ik heb een setup met 12 eenheden testen alle het nemen van een foto van mijn iPhone in werking stellend de stopwatch app. Elke foto veroverde hij exact hetzelfde 1/10de van een seconde.