Skip to content

Commit

Permalink
prepare v4.1 (#163)
Browse files Browse the repository at this point in the history
- tf 2.7
- fix 4.1 bugs
- Update wifi.py => changed approach: the daemons (hostapd, dhcpcd, wpa_supplicant) are started by systemd, wify.py is used to change config and verify connectivity in client mode.
- add CONTRIBUTING.md (#162)

Co-authored-by: previ <roberto.previtera@gmail.com>
Co-authored-by: Antonio Vivace <avivace4@gmail.com>
  • Loading branch information
previ and avivace committed Jul 8, 2022
1 parent cb29665 commit c889fb4
Show file tree
Hide file tree
Showing 13 changed files with 490 additions and 118 deletions.
336 changes: 336 additions & 0 deletions CONTRIBUTING.md

Large diffs are not rendered by default.

2 changes: 1 addition & 1 deletion api.py
Expand Up @@ -23,7 +23,7 @@
bot_config = Config.get()
bot = CoderBot.get_instance(
motor_trim_factor=float(bot_config.get("move_motor_trim", 1.0)),
encoder=bool(bot_config.get("encoder"))
hw_version=bot_config.get("hw_version")
)

def get_serial():
Expand Down
13 changes: 0 additions & 13 deletions camera.py
Expand Up @@ -49,7 +49,6 @@ class Camera(object):
# pylint: disable=too-many-public-methods

_instance = None
_img_template = image.Image.load("static/media/coderdojo-logo.png")

@classmethod
def get_instance(cls):
Expand Down Expand Up @@ -252,18 +251,6 @@ def find_line(self):
self.set_image_cv(img)
return coords

def find_signal(self):
angle = None
ts = time.time()
img = self.get_image()
signals = img.find_template(self._img_template)

logging.info("signal: %s", str(time.time() - ts))
if signals:
angle = signals[0].angle

return angle

def find_face(self):
face_x = face_y = face_size = None
img = self.get_image()
Expand Down
47 changes: 46 additions & 1 deletion coderbot.cfg
@@ -1 +1,46 @@
{"move_power_angle_3": "60", "cnn_default_model": "generic_fast_low", "prog_maxblocks": "-1", "camera_jpeg_quality": "5", "show_page_control": "true", "camera_framerate": "30", "prog_scrollbars": "true", "move_fw_speed": "100", "prog_level": "adv", "move_motor_trim": "1", "move_motor_mode": "dc", "cv_image_factor": "2", "move_power_angle_1": "45", "camera_path_object_size_min": "4000", "button_func": "none", "camera_color_object_size_min": "4000", "camera_jpeg_bitrate": "1000000", "move_fw_elapse": "1", "show_control_move_commands": "true", "camera_color_object_size_max": "160000", "show_page_prefs": "true", "camera_exposure_mode": "auto", "ctrl_tr_elapse": "-1", "show_page_program": "true", "move_tr_elapse": "0.5", "camera_path_object_size_max": "160000", "sound_shutter": "$shutter.wav", "ctrl_fw_elapse": "-1", "sound_stop": "$shutdown.wav", "ctrl_tr_speed": "80", "ctrl_fw_speed": "100", "move_tr_speed": "85", "move_power_angle_2": "60", "ctrl_hud_image": "", "load_at_start": "", "sound_start": "$startup.wav", "encoder": "True", "audio_volume_level": "100", "wifi_mode": "ap", "wifi_ssid": "coderbot", "wifi_psk": "coderbot", "packages_installed": ""}
{
"move_power_angle_3":"60",
"cnn_default_model":"generic_fast_low",
"prog_maxblocks":"-1",
"camera_jpeg_quality":"5",
"show_page_control":"true",
"camera_framerate":"30",
"prog_scrollbars":"true",
"move_fw_speed":"100",
"prog_level":"adv",
"move_motor_trim":"1",
"move_motor_mode":"dc",
"cv_image_factor":"2",
"move_power_angle_1":"45",
"camera_path_object_size_min":"4000",
"button_func":"none",
"camera_color_object_size_min":"4000",
"camera_jpeg_bitrate":"1000000",
"move_fw_elapse":"1",
"show_control_move_commands":"true",
"camera_color_object_size_max":"160000",
"show_page_prefs":"true",
"camera_exposure_mode":"auto",
"ctrl_tr_elapse":"-1",
"show_page_program":"true",
"move_tr_elapse":"0.5",
"camera_path_object_size_max":"160000",
"sound_shutter":"$shutter.wav",
"ctrl_fw_elapse":"-1",
"sound_stop":"$shutdown.wav",
"ctrl_tr_speed":"80",
"ctrl_fw_speed":"100",
"move_tr_speed":"85",
"move_power_angle_2":"60",
"ctrl_hud_image":"",
"load_at_start":"",
"sound_start":"$startup.wav",
"hw_version":"5",
"audio_volume_level":"100",
"wifi_mode":"ap",
"wifi_ssid":"coderbot_CHANGEMEATFIRSTRUN",
"wifi_psk":"coderbot",
"packages_installed":"",
"admin_password":"",
"hardware_version":"5"
}
19 changes: 14 additions & 5 deletions coderbot.py
Expand Up @@ -54,6 +54,8 @@ class GPIO_CODERBOT_V_4():
PIN_ENCODER_RIGHT_A = 15
PIN_ENCODER_RIGHT_B = 12

HAS_ENCODER = False

class GPIO_CODERBOT_V_5():
# motors
PIN_MOTOR_ENABLE = None #22
Expand Down Expand Up @@ -82,29 +84,36 @@ class GPIO_CODERBOT_V_5():
PIN_ENCODER_RIGHT_A = 24 #15
PIN_ENCODER_RIGHT_B = 25 #12

HAS_ENCODER = True

# PWM
PWM_FREQUENCY = 100 #Hz
PWM_RANGE = 100 #0-100

HW_VERSIONS = {
"4": GPIO_CODERBOT_V_4(),
"5": GPIO_CODERBOT_V_5()
}

class CoderBot(object):

# pylint: disable=too-many-instance-attributes

def __init__(self, motor_trim_factor=1.0, encoder=True):
def __init__(self, motor_trim_factor=1.0, hw_version="5"):
try:
self._mpu = mpu.AccelGyroMag()
logging.info("MPU available")
except:
logging.info("MPU not available")

self.GPIOS = GPIO_CODERBOT_V_5()
self.GPIOS = HW_VERSIONS.get(hw_version, GPIO_CODERBOT_V_5())
self._pin_out = [self.GPIOS.PIN_LEFT_FORWARD, self.GPIOS.PIN_RIGHT_FORWARD, self.GPIOS.PIN_LEFT_BACKWARD, self.GPIOS.PIN_RIGHT_BACKWARD, self.GPIOS.PIN_SERVO_1, self.GPIOS.PIN_SERVO_2]
self.pi = pigpio.pi('localhost')
self.pi.set_mode(self.GPIOS.PIN_PUSHBUTTON, pigpio.INPUT)
self._cb = dict()
self._cb_last_tick = dict()
self._cb_elapse = dict()
self._encoder = encoder
self._encoder = self.GPIOS.HAS_ENCODER
self._motor_trim_factor = motor_trim_factor
self._twin_motors_enc = WheelsAxel(
self.pi,
Expand Down Expand Up @@ -143,9 +152,9 @@ def exit(self):
s.cancel()

@classmethod
def get_instance(cls, motor_trim_factor=1.0, encoder=True, servo=False):
def get_instance(cls, motor_trim_factor=1.0, hw_version="5", servo=False):
if not cls.the_bot:
cls.the_bot = CoderBot(motor_trim_factor=motor_trim_factor, encoder=encoder)
cls.the_bot = CoderBot(motor_trim_factor=motor_trim_factor, hw_version=hw_version)
return cls.the_bot

def move(self, speed=100, elapse=0, distance=0):
Expand Down
1 change: 0 additions & 1 deletion data/activities.json

This file was deleted.

80 changes: 44 additions & 36 deletions data/defaults/config.json
@@ -1,38 +1,46 @@
{
"move_power_angle_3": "60",
"cnn_default_model": "fruit_025_128_1",
"prog_maxblocks": "-1",
"camera_jpeg_quality": "5",
"show_page_control": "true",
"camera_framerate": "30",
"prog_scrollbars": "true",
"move_fw_speed": "100",
"prog_level": "adv",
"move_motor_trim": "1",
"move_motor_mode": "dc",
"cv_image_factor": "2",
"move_power_angle_1": "45",
"camera_path_object_size_min": "4000",
"button_func": "none",
"camera_color_object_size_min": "4000",
"camera_jpeg_bitrate": "1000000",
"move_fw_elapse": "1",
"show_control_move_commands": "true",
"camera_color_object_size_max": "160000",
"show_page_prefs": "true",
"camera_exposure_mode": "auto",
"ctrl_tr_elapse": "-1",
"show_page_program": "true",
"move_tr_elapse": "0.5",
"camera_path_object_size_max": "160000",
"sound_shutter": "$shutter.mp3",
"ctrl_fw_elapse": "-1",
"sound_stop": "$shutdown.mp3",
"ctrl_tr_speed": "80",
"ctrl_fw_speed": "100",
"move_tr_speed": "85",
"move_power_angle_2": "60",
"ctrl_hud_image": "",
"load_at_start": "",
"sound_start": "$startup.mp3"
"move_power_angle_3":"60",
"cnn_default_model":"generic_fast_low",
"prog_maxblocks":"-1",
"camera_jpeg_quality":"5",
"show_page_control":"true",
"camera_framerate":"30",
"prog_scrollbars":"true",
"move_fw_speed":"100",
"prog_level":"adv",
"move_motor_trim":"1",
"move_motor_mode":"dc",
"cv_image_factor":"2",
"move_power_angle_1":"45",
"camera_path_object_size_min":"4000",
"button_func":"none",
"camera_color_object_size_min":"4000",
"camera_jpeg_bitrate":"1000000",
"move_fw_elapse":"1",
"show_control_move_commands":"true",
"camera_color_object_size_max":"160000",
"show_page_prefs":"true",
"camera_exposure_mode":"auto",
"ctrl_tr_elapse":"-1",
"show_page_program":"true",
"move_tr_elapse":"0.5",
"camera_path_object_size_max":"160000",
"sound_shutter":"$shutter.wav",
"ctrl_fw_elapse":"-1",
"sound_stop":"$shutdown.wav",
"ctrl_tr_speed":"80",
"ctrl_fw_speed":"100",
"move_tr_speed":"85",
"move_power_angle_2":"60",
"ctrl_hud_image":"",
"load_at_start":"",
"sound_start":"$startup.wav",
"hw_version":"5",
"audio_volume_level":"100",
"wifi_mode":"ap",
"wifi_ssid":"coderbot_CHANGEMEATFIRSTRUN",
"wifi_psk":"coderbot",
"packages_installed":"",
"admin_password":"",
"hardware_version": "5"
}
11 changes: 10 additions & 1 deletion main.py
Expand Up @@ -460,15 +460,24 @@ def remove_doreset_file():
except OSError:
pass

def align_wifi_config():
if app.bot_config["wifi_ssid"] == "coderbot_CHANGEMEATFIRSTRUN":
out = os.popen("sudo ./wifi.py getcfg --ssid").read()
if "coderbot_" in out:
app.bot_config["wifi_ssid"] = out.split()[0]
Config.write(app.bot_config)
app.bot_config = Config.get()

# Finally, get the server running
def run_server():
bot = None
cam = None
try:
try:
app.bot_config = Config.read()
align_wifi_config()
bot = CoderBot.get_instance(motor_trim_factor=float(app.bot_config.get('move_motor_trim', 1.0)),
encoder=bool(app.bot_config.get('encoder')))
hw_version=app.bot_config.get('hardware_version'))
audio = Audio.get_instance()
audio.say(app.bot_config.get("sound_start"))

Expand Down
21 changes: 0 additions & 21 deletions static/js/blockly/blocks.js
Expand Up @@ -572,27 +572,6 @@ Blockly.Python['coderbot_adv_findLine'] = function(block) {
return [code, Blockly.Python.ORDER_ATOMIC];
};

Blockly.Blocks['coderbot_adv_findSignal'] = {
/**
* Block for findSignal function.
* @this Blockly.Block
*/
init: function() {
this.setHelpUrl(Blockly.Msg.LOGIC_BOOLEAN_HELPURL);
this.setColour(250);
this.appendDummyInput()
.appendField(Blockly.Msg.CODERBOT_SENSOR_FINDSIGNAL);
this.setOutput(true, 'Number');
this.setTooltip(Blockly.Msg.LOGIC_BOOLEAN_TOOLTIP);
}
};

Blockly.Python['coderbot_adv_findSignal'] = function(block) {
// Boolean values true and false.
var code = 'get_cam().find_signal()';
return [code, Blockly.Python.ORDER_ATOMIC];
};

Blockly.Blocks['coderbot_adv_findFace'] = {
/**
* Block for findSignal function.
Expand Down
Binary file removed static/media/coderdojo-logo.png
Binary file not shown.

0 comments on commit c889fb4

Please sign in to comment.