12 Commits

30 changed files with 2126 additions and 46 deletions

View File

@@ -1,5 +1,12 @@
# discoverpixy
Project with the Pixy cam and the STM32F4 Discovery
A Project with the Pixy cam and the STM32F4 Discovery. The project can also be run on linux/windows using a qt-based emulator.
![Pixy Logo](doc/pixy.png)
<img src="doc/mainscreen_emulator.png" width="300">
<img src="doc/tracking_emulator.png" width="300">
## Documentation
Take a look at our [docu.pdf](./doc/docu.pdf) (German)
## Folder structure
* *common*: device independent code and the "Application" itself

View File

@@ -16,15 +16,11 @@
#include<stdint.h>
// PID tuning factors
#define REG_PID_KP (0.41f)
#define REG_PID_KP (0.5f)
#define REG_PID_KI (0.001f)
#define REG_PID_KD (0.00025f)
#define REG_PID_TA (0.001f)
#define REG_PID_YKOR (0.3f)
#define REG_PID_KD (0.001f)
#define REG_PID_TA (0.01f)
void int_init(void){
// TODO Init ports and outputs if needed.
}
// PID controller implementatoin for the y-axis
int16_t pixy_PID_Y(int16_t x, int16_t w)
@@ -39,7 +35,7 @@ int16_t pixy_PID_Y(int16_t x, int16_t w)
//----PID-control-------------------------------------------------------------------------
esum = esum + e; // add e to the current sum
y += (REG_PID_KP + REG_PID_YKOR) * e; // add the proportional part to the output
y += REG_PID_KP * e; // add the proportional part to the output
y += REG_PID_KI * REG_PID_TA * esum; // add the integral part to the output
y += REG_PID_KD * (e - eold) / REG_PID_TA; // add the differential part to the output
//----------------------------------------------------------------------------------------

View File

@@ -1,14 +1,41 @@
/*
* pixy_control.h
*/
#ifndef _CONTROL_H_
#define _CONTROL_H_
#ifndef PIXY_CONTROL_H_
#define PIXY_CONTROL_H_
#include<stdint.h>
void int_init(void);
/**
* @addtogroup app
*/
/*@{*/
/**
* @defgroup pixy_control Pixy Control Helper
* A collection of helper functions that contain PID Control code used for object tracking.
*/
/*@}*/
/**
* @addtogroup pixy_control
*/
/*@{*/
/**
* Execute one step of PID regulation for the Y-servo.
* @param x desired value (e.g. current y-position of the biggest block)
* @param w actual value (e.g desired y-position)
* @return The offset which needs to be added to the Y-Servo position
*/
int16_t pixy_PID_Y(int16_t x, int16_t w);
/**
* Execute one step of PID regulation for the X-servo.
* @param x desired value (e.g. current x-position of the biggest block)
* @param w actual value (e.g desired x-position)
* @return The offset which needs to be added to the X-Servo position
*/
int16_t pixy_PID_X(int16_t x, int16_t w);
#endif
/*@}*/
#endif /* PIXY_CONTROL_H_ */

View File

@@ -1,4 +1,4 @@
#include "pixy_helper.h"
#include "pixy_frame.h"
#include "pixy.h"
#include "tft.h"
#include <stdlib.h>

View File

@@ -1,10 +1,30 @@
#ifndef PIXY_HELPER_H
#define PIXY_HELPER_H
#ifndef PIXY_FRAME_H
#define PIXY_FRAME_H
#include <stdbool.h>
#include <stdint.h>
#include "filesystem.h"
/**
* @addtogroup app
*/
/*@{*/
/**
* @defgroup pixy_helper Pixy Frame Helper
* A collection of helper functions that allow receiving and rendering a frame from pixy onto the display.
* Furthermore you can select a color in a frame, to use for tracking.
*/
/*@}*/
/**
* @addtogroup pixy_helper
*/
/*@{*/
/**
* Receives a fullsized frame from pixy and display's it on the display with the topleft corner at (x,y)
* @param x The x-Coordinate of the top left corner
@@ -56,4 +76,6 @@ int pixy_save_cropped_frame(FILE_HANDLE* handle, uint16_t xoffset, uint16_t yoff
*/
int pixy_cc_set_region(uint8_t signum, uint16_t xoffset, uint16_t yoffset, uint16_t width, uint16_t height);
#endif /* PIXY_HELPER_H */
/*@}*/
#endif /* PIXY_FRAME_H */

View File

@@ -5,7 +5,7 @@
#include "touch.h"
#include "pixy.h"
#include "system.h"
#include "pixy_helper.h"
#include "pixy_frame.h"
static bool pixy_connected = false; //Whether or not the pixy cam is currently connected

View File

@@ -4,7 +4,7 @@
#include "tft.h"
#include "touch.h"
#include "pixy.h"
#include "pixy_helper.h"
#include "pixy_frame.h"
#include <stdlib.h>
#include <string.h>

View File

@@ -5,7 +5,7 @@
#include "touch.h"
#include "pixy.h"
#include "system.h"
#include "pixy_helper.h"
#include "pixy_frame.h"
static volatile enum {detecting, idle,update_servos, update_ledcolor, update_ledcurrent} state; //Current state of the screen state machine

View File

@@ -6,7 +6,7 @@
#include "touch.h"
#include "pixy.h"
#include "system.h"
#include "pixy_helper.h"
#include "pixy_frame.h"
static BUTTON_STRUCT b_back; //Button to navigate back
static BUTTON_STRUCT b_select; //Button to start the color region selection

Binary file not shown.

Binary file not shown.

BIN
doc/mainscreen_emulator.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 37 KiB

BIN
doc/pixy.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 185 KiB

BIN
doc/tracking_emulator.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 57 KiB

5
emulator/.gitignore vendored
View File

@@ -5,8 +5,9 @@ qt/*.o
qt/*.a
qt/ui_*
qt/moc_*
qt/Makefile
qt/Makefile*
qt/debug
qt/release
libs/*/obj
libs/*/*.a

View File

@@ -10,7 +10,7 @@ QT_DIR=./qt
COMMON_DIR=../common
#Tools
CC=gcc -fdiagnostics-color=auto
CC=gcc #-fdiagnostics=auto
GDB=gdb
@@ -24,17 +24,22 @@ INCLUDES:=$(addprefix -I,$(INCLUDES))
QT_LIB=$(QT_DIR)/libemulatorqt.a
CPPFLAGS= -march=x86-64 -mtune=generic -fPIC $(INCLUDES)
CFLAGS= -O0 -g -std=c99
CPPFLAGS= -march=x86-64 -mtune=generic #-fPIC
CPPFLAGS+= $(INCLUDES)
CFLAGS= -O0 -g -std=c99 -mwindows
LIBS= pixy usb-1.0 boost_system boost_timer boost_chrono
LIBS+=Qt5Core Qt5Gui Qt5Widgets emulatorqt m stdc++
LIBS= emulatorqt pixy usb-1.0
LIBS+= boost_system-mgw49-mt-1_58 boost_timer-mgw49-mt-1_58 boost_chrono-mgw49-mt-1_58
LIBS+= Qt5Core Qt5Gui Qt5Widgets m stdc++
LDFLAGS= -L$(QT_DIR) $(addprefix -l,$(LIBS))
LDFLAGS= -static-libgcc -static-libstdc++ #-Wl,-t -Wl,--Map=a.map
LDFLAGS+= -L$(QT_DIR)
LDFLAGS+= -L$(LIB_DIR)/Pixy
LDFLAGS+= -L$(LIB_DIR)/boost/lib
LDFLAGS+= -LC:/Qt/5.4/mingw491_32/lib
LDFLAGS+= -L$(LIB_DIR)/Pixy/windows
LDFLAGS+= $(addprefix -l,$(LIBS))
#Finding Input files
CFILES=$(shell find . -maxdepth 1 -name '*.c')
@@ -58,7 +63,7 @@ debug: all
$(GDB) ./build/emulator
$(QT_LIB):
cd $(QT_DIR) && qmake &&make
cd $(QT_DIR) && qmake && $(MAKE)
#objects to elf
$(BUILD_DIR)/$(TARGET): $(OBJS) $(COMMON_OBJS) $(QT_LIB)
@@ -83,7 +88,7 @@ $(OBJ_DIR)/%.o: $(COMMON_DIR)/%.c
#Clean Obj files and builded stuff
clean:
cd $(QT_DIR) && $(MAKE) clean && $(RM) Makefile && $(RM) *.a
cd $(QT_DIR) && $(MAKE) clean && $(RM) Makefile* && $(RM) *.a && $(RMDIR) debug release
$(RMDIR) $(BUILD_DIR) $(OBJ_DIR)

View File

@@ -17,11 +17,13 @@ OBJ_DIR=./obj
#Architecture flags
#Compiler, Linker Options
CPPFLAGS=-I$(INC_DIR) -D__LINUX__=1 -DHOST=1 #-DDEBUG=1
CPPFLAGS=-I$(INC_DIR) -DHOST=1 #-D__LINUX__=1 -DDEBUG=1
CFLAGS=$(ARCH_FLAGS) -O0 -g #-ffunction-sections -fdata-sections -g
#CFLAGS += -mlittle-endian -mthumb -mcpu=cortex-m4 -mthumb-interwork
#CFLAGS += -mfloat-abi=hard -mfpu=fpv4-sp-d16
CFLAGS+=-I/usr/include/libusb-1.0
CFLAGS+=-I../boost/include/
CFLAGS+=-I./windows/
#Finding Input files
CFILES=$(shell find $(SRC_DIR) -name '*.cpp')

Binary file not shown.

Binary file not shown.

File diff suppressed because it is too large Load Diff

2
emulator/libs/boost/.gitignore vendored Normal file
View File

@@ -0,0 +1,2 @@
include
lib

Binary file not shown.

View File

@@ -0,0 +1,2 @@
This directory is only needed on windows, and if you do not have boost installed.
Extract the rar file here, to get boost 1.58 header files and the libraries that we need for discoverpixy

View File

@@ -8,7 +8,7 @@ QT += widgets gui
TARGET = emulatorqt
TEMPLATE = lib
CONFIG += staticlib
CONFIG += staticlib debug
SOURCES += \
mainwindow.cpp \
@@ -30,3 +30,6 @@ INCLUDEPATH+= ../../common/lowlevel/ \
FORMS += \
mainwindow.ui
DESTDIR = $$_PRO_FILE_PWD_ #force windows to not create subfolders
#QMAKE_CXXFLAGS+= -v

View File

@@ -52,9 +52,9 @@ uint8_t ll_tft_num_fonts() {
QFont get_font(uint8_t fontnum) {
switch(fontnum) {
case 0:
return QFont("Monospace",8);
return QFont("Courier New",8);
case 1:
return QFont("DejaVu Sans Mono",14);
return QFont("Courier New",14);
default:
return QFont();
}

View File

@@ -0,0 +1,26 @@
Prerequisites:
- Qt5 for Windows (provides C:\Qt\5.4\mingw491_32 and C:\Qt\Tools\mingw491_32)
- Mingw msys-base (provides C:\MinGW\msys\1.0 and make, find )
- Boost (check emulator\libs\boost)
Steps:
- Open up the msys shell using the batchfile
- Navigate to the emulator folder of the project
- Source the qt binaries (qmake, gcc, g++) by executing
export PATH=$PATH:/c/Qt/Tools/mingw491_32/bin:/c/Qt/5.4/mingw491_32/bin
- navigate to libs/Pixy and execute make
- navigate back into the emulator folder and execute make
- this should generate you build/emulator.exe
Starting:
- Extract windows_dlls.rar to the build folder
- Copy the emulated folder into the build folder
- Make sure that you installed the pixy usb driver (e.g. by installing pixymon http://cmucam.org/projects/cmucam5/wiki/Latest_release)
- Start emulator.exe
Pitfalls:
- libstdc++ must be provided by qt. do not use one of msys or mingw. you will waste hours with debugging of the make process
Sources:
- libusb for windows was taken from https://github.com/charmedlabs/pixy/tree/master/src/host/windows
- Boost was compiled from sources, using http://andres.jaimes.net/718/how-to-install-the-c-boost-libraries-on-windows/ and http://www.boost.org/doc/libs/1_58_0/more/getting_started/windows.html

BIN
emulator/windows_dlls.rar Normal file

Binary file not shown.

View File

@@ -7,7 +7,7 @@ echo "* Institution: BFH Bern University of Applied Sciences"
echo "* File: $1"
echo "*"
echo "* Version History:"
echo "* Date Autor Email SHA Changes"
echo "* Date Autor Email SHA Changes"
git log --pretty=format:"* %ad%x09%ae%x09%h%x09%s" --date=short --date-order --no-merges --reverse $1 | grep -v -i "fileheader"

16
utils/style.astylerc Normal file
View File

@@ -0,0 +1,16 @@
# general style
--style=1tbs
--indent=spaces=4 # default
--lineend=linux #only \r as line ending
# alignment
--align-pointer=type #put asterisks to the type. eg. char* a
--align-reference=type #put references to the type. eg. int& a
# padding
--break-blocks # insert empty lines between header blocks
--unpad-paren # remove extra padding around parens
--pad-oper # spaces around operators
--pad-header # insert space between header blocks and the following paren
--add-brackets # add brackets to one line conditionals

View File

@@ -3,14 +3,15 @@
FILES=`find common/ emulator/ discovery/ -name "*.c" -or -name "*.h" -or -name "*.cpp" | grep -v libs | grep -v /pixy/`
for FILE in $FILES; do
echo "Adding Header to $FILE"
#remove old header
CONTENT=$(perl -0777 -pe 's%^/\*.*?discoverpixy.*?\*/%%igs' $FILE)
#remove old header, and format file with astyle
CONTENT=$(perl -0777 -pe 's%^/\*.*?discoverpixy.*?\*/%%igs' $FILE | astyle --options=./utils/style.astylerc)
#add new header
./genheader.sh $FILE > $FILE
./utils/genheader.sh $FILE > $FILE
#append file content
echo "$CONTENT" >> $FILE