oberta.experimenta.science Open in urlscan Pro
153.92.81.186  Public Scan

URL: https://oberta.experimenta.science/
Submission: On February 09 via api from US — Scanned from US

Form analysis 11 forms found in the DOM

<form id="wlan-form" novalidate="novalidate">
  <div class="modal-body">
    <div class="form-group">
      <label for="wlanSsid" lkey="Blockly.Msg.POPUP_WLAN_SSID" value="SSID">SSID</label>
      <div class="input-group">
        <span class="input-group-addon typcn input-typcn typcn-user"></span>
        <input type="text" class="form-control" id="wlanSsid" name="wlanSsid" autofocus="">
      </div>
    </div>
    <div class="form-group">
      <label for="wlanPassword" lkey="Blockly.Msg.POPUP_PASSWORD" value="Password">Password</label>
      <div class="input-group">
        <span class="input-group-addon typcn input-typcn typcn-lock-closed"></span>
        <input type="password" class="form-control" id="wlanPassword" name="wlanPassword">
      </div>
    </div>
  </div>
  <div class="modal-footer">
    <label lkey="Blockly.Msg.POPUP_WLAN_SECURITY_INFORMATION"
      value="Please note that the data provided in this dialog window is private and will not be stored in the OpenRoberta lab; it will only be used for program creation and during the compilation process. Make sure that for each new session you enter these credentials again. Please keep in mind that exposing this information to public may pose security risks.">Please
      note that the data provided in this dialog window is private and will not be stored in the OpenRoberta lab; it will only be used for program creation and during the compilation process. Make sure that for each new session you enter these
      credentials again. Please keep in mind that exposing this information to public may pose security risks.</label>
    <button type="submit" class="btn btn-primary" id="setWlanCredentials">OK</button>
  </div>
</form>

<form id="login-form" novalidate="novalidate">
  <div class="modal-body">
    <div class="form-group">
      <label for="loginAccountName" lkey="Blockly.Msg.POPUP_USERNAME" value="Username">Username</label>
      <div class="input-group">
        <span class="input-group-addon typcn input-typcn typcn-user"></span>
        <input type="text" class="form-control" id="loginAccountName" name="loginAccountName" autofocus="">
      </div>
    </div>
    <div class="form-group">
      <label for="loginPassword" lkey="Blockly.Msg.POPUP_PASSWORD" value="Password">Password</label>
      <div class="input-group">
        <span class="input-group-addon typcn input-typcn typcn-lock-closed"></span>
        <input type="password" class="form-control" id="loginPassword" name="loginPassword">
      </div>
    </div>
  </div>
  <div class="modal-footer">
    <button type="submit" class="btn btn-primary" id="doLogin">OK</button>
    <div>
      <button type="button" id="login_lost_btn" class="btn-link" lkey="Blockly.Msg.POPUP_PASSWORD_RECOVERY" value="reset password ...">reset password ...</button>
      <button type="button" id="login_register_btn" class="btn-link" lkey="Blockly.Msg.MENU_NEW" value="new">new</button>
    </div>
  </div>
</form>

<form id="register-form" style="display: none;" novalidate="novalidate">
  <div class="modal-body">
    <div class="form-group">
      <label for="registerAccountName" lkey="Blockly.Msg.POPUP_USERNAME" value="Username">Username</label>
      <div class="input-group">
        <span class="input-group-addon typcn input-typcn typcn-user"></span>
        <input type="text" class="form-control" id="registerAccountName" name="registerAccountName">
      </div>
      <div class="hint" style="display: none" lkey="Blockly.Msg.HINT_USER_ACCOUNT" value="»IAmBotman« or »RobellaStracciatella«? Not everyone needs to know your real name. Think of a cool nickname that you can easily remember.">»IAmBotman« or
        »RobellaStracciatella«? Not everyone needs to know your real name. Think of a cool nickname that you can easily remember.</div>
    </div>
    <div class="form-group" id="fgRegisterPass">
      <label for="registerPass" lkey="Blockly.Msg.POPUP_PASSWORD" value="Password">Password</label>
      <div class="input-group">
        <span class="input-group-addon typcn input-typcn typcn-lock-closed"></span>
        <input type="password" class="form-control" id="registerPass" name="registerPass">
      </div>
      <div class="hint" style="display: none" lkey="Blockly.Msg.HINT_USER_PASSWORT" value="12345 is no secure password. Rather think of a safe combination of numbers and letters that you will not forget.">12345 is no secure password. Rather think of
        a safe combination of numbers and letters that you will not forget.</div>
    </div>
    <div class="form-group" id="fgRegisterPassConfirm">
      <label for="registerPassConfirm" lkey="Blockly.Msg.POPUP_REPEAT_PASSWORD" value="Repeat password">Repeat password</label>
      <div class="input-group">
        <span class="input-group-addon typcn input-typcn typcn-lock-closed"></span>
        <input type="password" class="form-control" id="registerPassConfirm" name="registerPassConfirm">
      </div>
      <div class="hint" style="display: none" lkey="Blockly.Msg.HINT_USER_PASSWORT_CONFIRM" value="Got it? Better make sure!">Got it? Better make sure!</div>
    </div>
    <div class="form-group">
      <label for="registerUserName" lkey="Blockly.Msg.POPUP_NAME" value="Name">Name</label>
      <div class="input-group">
        <span class="input-group-addon typcn input-typcn typcn-user-outline"></span>
        <input type="text" class="form-control" id="registerUserName" name="registerUserName">
      </div>
      <div class="hint" style="display: none" lkey="Blockly.Msg.HINT_USER_NAME" value="Enter your real name here if you like. This is just for you, no one else will see it.">Enter your real name here if you like. This is just for you, no one else
        will see it.</div>
    </div>
    <div class="form-group">
      <label for="registerUserEmail" lkey="Blockly.Msg.POPUP_EMAIL" value="E-Mail">E-Mail</label>
      <div class="input-group">
        <span class="input-group-addon typcn input-typcn typcn-at"></span>
        <input type="email" class="form-control" id="registerUserEmail" name="registerUserEmail">
      </div>
      <div class="hint" style="display: none" lkey="Blockly.Msg.HINT_USER_EMAIL"
        value="This is voluntary! However, some functions of the lab are only available if you have verified your account by e-mail. You are younger than 16? Please ask your parents to help you out with one of their e-mail addresses. <br><a href='https://www.roberta-home.de/index.php?id=138&amp;L=1' target='_blank'>Further information ...</a>">
        This is voluntary! However, some functions of the lab are only available if you have verified your account by e-mail. You are younger than 16? Please ask your parents to help you out with one of their e-mail addresses.
        <br><a href="https://www.roberta-home.de/index.php?id=138&amp;L=1" target="_blank">Further information ...</a></div>
    </div>
    <div class="form-group" id="fgUserAge" style="display: none">
      <label for="registerUserAge" lkey="Blockly.Msg.POPUP_AGE" value="Age">Age</label>
      <div class="input-group">
        <span class="input-group-addon typcn input-typcn typcn-at"></span>
        <select class="form-control" id="registerUserAge" name="registerUserAge">
          <option value="1" lkey="Blockly.Msg.YOUNGER_THEN_14">I am younger than 16!</option>
          <option value="2" lkey="Blockly.Msg.OLDER_THEN_14">I am 16 or older than 16!</option>
        </select>
      </div>
      <div class="hint" style="display: none" lkey="Blockly.Msg.HINT_USER_AGE" value="Are you under 16? Then please ask your parents to help you. They can specify their e-mail address to confirm your account.">Are you under 16? Then please ask your
        parents to help you. They can specify their e-mail address to confirm your account.</div>
    </div>
  </div>
  <div class="modal-footer">
    <button id="showChangeUserPassword" type="button" class="btn-link hidden" lkey="Blockly.Msg.POPUP_CHANGE_PASSWORD" value="change password ...">change password ...</button>
    <button id="resendActivation" type="button" class="btn-link hidden" lkey="Blockly.Msg.RESEND_ACTIVATION" value="resend verification email">resend verification email</button>
    <button type="submit" class="btn btn-primary" id="registerUser" lkey="Blockly.Msg.POPUP_REGISTER_USER" value="Register now">Register now</button>
    <div>
      <button id="register_login_btn" type="button" class="btn-link" lkey="Blockly.Msg.MENU_LOG_IN" value="login ...">login ...</button>
      <button id="register_lost_btn" type="button" class="btn-link" lkey="Blockly.Msg.POPUP_PASSWORD_RECOVERY" value="reset password ...">reset password ...</button>
    </div>
  </div>
</form>

<form id="lost-form" style="display: none;" novalidate="novalidate">
  <div class="modal-body">
    <div class="form-group">
      <label for="lost_email" lkey="Blockly.Msg.POPUP_EMAIL" value="E-Mail">E-Mail</label>
      <div class="input-group">
        <span class="input-group-addon typcn input-typcn typcn-mail"></span>
        <input type="email" id="lost_email" class="form-control" name="lost_email">
      </div>
    </div>
  </div>
  <div class="modal-footer">
    <button type="submit" class="btn btn-primary" id="sendEmailLostPassword" lkey="Blockly.Msg.POPUP_EMAIL_SEND" value="Send now">Send now</button>
    <div>
      <button id="lost_login_btn" type="button" class="btn-link" lkey="Blockly.Msg.MENU_LOG_IN" value="login ...">login ...</button>
      <button id="lost_register_btn" type="button" class="btn-link" lkey="Blockly.Msg.MENU_NEW" value="new">new</button>
    </div>
  </div>
</form>

<form id="change-user-password-form" novalidate="novalidate">
  <div class="modal-body">
    <div id="grOldPassword" class="form-group">
      <label for="passOld" lkey="Blockly.Msg.POPUP_OLD_PASSWORD" value="Old Password">Old Password</label>
      <div class="input-group">
        <span class="input-group-addon typcn input-typcn typcn-lock-closed"></span>
        <input type="password" class="form-control" id="passOld" name="passOld" autofocus=""> <input type="hidden" class="form-control" id="resetPassLink" name="resetPassLink">
      </div>
    </div>
    <div class="form-group">
      <label for="passNew" lkey="Blockly.Msg.POPUP_NEW_PASSWORD" value="New Password">New Password</label>
      <div class="input-group">
        <span class="input-group-addon typcn input-typcn typcn-lock-closed"></span>
        <input type="password" class="form-control" id="passNew" name="passNew">
      </div>
    </div>
    <div class="form-group">
      <label for="passNewRepeat" lkey="Blockly.Msg.POPUP_REPEAT_PASSWORD" value="Repeat password">Repeat password</label>
      <div class="input-group">
        <span class="input-group-addon typcn input-typcn typcn-lock-closed"></span>
        <input type="password" class="form-control" id="passNewRepeat" name="passNewRepeat">
      </div>
    </div>
  </div>
  <div class="modal-footer">
    <button type="submit" class="btn btn-primary" id="changeUserPassword">OK</button>
    <input type="button" class="btn backButton" data-dismiss="modal" lkey="Blockly.Msg.POPUP_CANCEL" value="Cancel">
  </div>
</form>

<form id="loginUsergroupLoginForm" novalidate="novalidate">
  <div class="modal-body">
    <div class="form-group">
      <label for="usergroupLoginOwner" lkey="Blockly.Msg.DATATABLE_USERGROUP_OWNER" value="Name of the owner of the user group">Name of the owner of the user group</label>
      <div class="input-group">
        <span class="input-group-addon typcn input-typcn typcn-mortar-board"></span>
        <input type="text" class="form-control" id="usergroupLoginOwner" name="userGroupOwner" autofocus="">
      </div>
      <div class="hint" style="display: none" lkey="Blockly.Msg.HINT_USERGROUP_OWNER" value="Do <strong>not</strong> enter the real name of the owner of the user group here, but his <strong>username</strong> instead.">Do <strong>not</strong> enter
        the real name of the owner of the user group here, but his <strong>username</strong> instead.</div>
    </div>
    <div class="form-group">
      <label for="usergroupLoginUserGroup" lkey="Blockly.Msg.DATATABLE_USERGROUP_NAME" value="Name of the user group">Name of the user group</label>
      <div class="input-group">
        <span class="input-group-addon typcn input-typcn typcn-group"></span>
        <input type="text" class="form-control" id="usergroupLoginUserGroup" name="userGroupName">
      </div>
      <div class="hint" style="display: none" lkey="Blockly.Msg.USERGROUP_NAME_HINT" value="The user group to which you want to log in has a name. Enter it here.">The user group to which you want to log in has a name. Enter it here.</div>
    </div>
    <div class="form-group">
      <label for="usergroupLoginAccount" lkey="Blockly.Msg.POPUP_USERNAME" value="Username">Username</label>
      <div class="input-group">
        <span class="input-group-addon typcn input-typcn typcn-user"></span>
        <input type="text" class="form-control" id="usergroupLoginAccount" name="accountName">
      </div>
      <div class="hint" style="display: none" lkey="Blockly.Msg.HINT_USERGROUP_MEMBER" value="Enter the member id of your user here.">Enter the member id of your user here.</div>
    </div>
    <div class="form-group">
      <label for="usergroupLoginPassword" lkey="Blockly.Msg.POPUP_PASSWORD" value="Password">Password</label>
      <div class="input-group">
        <span class="input-group-addon typcn input-typcn typcn-lock-closed"></span>
        <input type="password" class="form-control" id="usergroupLoginPassword" name="password">
      </div>
    </div>
  </div>
  <div class="modal-footer">
    <button type="submit" class="btn btn-primary" id="loginUsergroupLoginSubmit">OK</button>
    <div>
      <button type="button" id="lostPasswordUsergroupLogin" class="btn-link" lkey="Blockly.Msg.POPUP_PASSWORD_RECOVERY" value="reset password ...">reset password ...</button>
    </div>
  </div>
</form>

<form id="notificationForm">
  <h4>Upload</h4>
  <div id="notification-modal-alert" class="alert" role="alert" style="display: none"></div>
  <label class="btn btn-default" for="notificationFileUpload">
    <span class="typcn typcn-upload"></span>
    <input type="file" class="hidden" id="notificationFileUpload"> </label>
  <button type="submit" class="btn btn-default">Send</button>
  <hr>
  <h4>Download</h4>
  <a id="notificationFileDownload" href="" download="notifications.json" class="btn btn-default">
                            <span class="typcn typcn-download"></span>
                        </a>
</form>

<form id="single-modal-form">
  <div class="modal-body">
    <div class="form-group">
      <label for="singleModalInput">Single Input</label>
      <div class="input-group">
        <span class="input-group-addon typcn input-typcn typcn-pencil"></span>
        <input type="text" class="form-control" id="singleModalInput" name="singleModalInput">
      </div>
      <div align="right">
        <a href="#" target="_blank" style="display: inline;"></a>
      </div>
    </div>
  </div>
  <div class="modal-footer">
    <button type="submit" class="btn btn-primary" id="singleModalOk">OK</button>
    <input type="button" class="btn backButton" data-dismiss="modal" lkey="Blockly.Msg.POPUP_CANCEL" value="Cancel">
  </div>
</form>

<form id="single-modal-list-form">
  <div class="modal-body">
    <div class="form-group">
      <label for="singleModalListInput">Please, choose a robot</label>
      <div class="input-group">
        <span class="input-group-addon typcn input-typcn typcn-pencil"></span>
        <select class="form-control" id="singleModalListInput" name="singleModalListInput"> </select>
      </div>
      <div align="right">
        <a href="#" target="_blank" style="display: inline;"></a>
      </div>
    </div>
  </div>
  <div class="modal-footer">
    <button type="submit" class="btn btn-primary" id="singleModalListOk">OK</button>
    <input type="button" class="btn backButton" data-dismiss="modal" lkey="Blockly.Msg.POPUP_CANCEL" value="Cancel">
  </div>
</form>

Name: userGroup

<form id="user-group-form" name="userGroup" novalidate="novalidate">
  <div class="modal-body" style="width: auto; height: auto; max-height: 100%">
    <div class="form-group">
      <label for="createAccountName" lkey="Blockly.Msg.DATATABLE_USERGROUP_NAME" value="Name of the user group">Name of the user group</label>
      <div class="input-group">
        <span class="input-group-addon typcn input-typcn typcn-tag"></span>
        <input type="text" class="form-control" id="userGroupNameInput" name="name" lkey="Blockly.Msg.DATATABLE_USERGROUP_NAME_CREATE_HINT" data-translation-targets="title"
          title="The name of the user group. Kepp in mind, that the members will have to type it in each time they log in.">
      </div>
      <div class="hint" style="display: none"></div>
    </div>
    <div class="form-group">
      <label for="initialMembersInput" lkey="Blockly.Msg.USERGROUP_GENERATED_MEMBERS" value="Automatically generated members">Automatically generated members</label>
      <div class="input-group">
        <span class="input-group-addon typcn input-typcn typcn-user-add"></span>
        <input type="number" value="0" class="form-control" id="initialMembersInput" name="initialMembers">
      </div>
      <div class="hint" lkey="Blockly.Msg.USERGROUP_GENERATED_MEMBERS_TOOLTIP" data-translation-targets="html">Automatically genertated members are normal members of a user group. They are generated with a number as username, which you can change
        afterwards.</div>
    </div>
  </div>
</form>

<form id="user-group-add-members-form" novalidate="novalidate">
  <div class="modal-body" style="width: auto; height: auto; max-height: 100%">
    <div class="form-group">
      <label for="additionalMembersInput" lkey="Blockly.Msg.USERGROUP_GENERATED_MEMBERS" value="Automatically generated members">Automatically generated members</label>
      <div class="input-group">
        <span class="input-group-addon typcn input-typcn typcn-user-add"></span>
        <input type="number" value="" class="form-control" id="additionalMembersInput" name="additionalMembers">
      </div>
      <div class="hint" lkey="Blockly.Msg.USERGROUP_GENERATED_MEMBERS_TOOLTIP" data-translation-targets="html">Automatically genertated members are normal members of a user group. They are generated with a number as username, which you can change
        afterwards.</div>
    </div>
  </div>
</form>

Text Content

   
 * edit
   * run on »EV3 leJOS 0.9.1« Ctrl + R
   * open/close simulation view
   * reset to factory defaults
   * new
   * my programs ... Ctrl + M
   * multiple robot simulation ...
   * example programs ...
   * save Ctrl/Cmd + S
   * save as ... Ctrl/Cmd + Shift + S
   * open/close source code view
   * open source code editor
   * create program link ...
   * export program Ctrl/Cmd + E
   * export all programs
   * import program ... Ctrl/Cmd + I
   * attach ...
   * properties
   * 
   * NEPO-Blocks beginner
   * NEPO-Blocks expert
   
 * edit
   * check
   * new
   * my configurations ...
   * save
   * save as ...
   * properties
   
 * robot
   * connect ...
   * info
   * WLAN credentials ...
   * 
   * Spike Prime / Robot Inventor
   * Thymio
   * WeDo
   * EV3 leJOS 0.9.1
   * EV3 leJOS 0.9.0
   * EV3dev
   * EV3 c4ev3
   * Open Roberta xNN
   * NXT
   * micro:bit
   * micro:bit V2
   * micro:bit Joy-Car
   * Bot'n Roll
   * NAO
   * BOB3
   * ROB3RTA
   * senseBox
   * mBot
   * mBot 2
   * Edison
   * Bionics Kit
   * Bionic Flower
   * Nepo4Arduino Uno
   * Nepo4Arduino Uno Wifi Rev2
   * Nepo4Arduino Nano
   * Nepo4Arduino Mega
   * Nepo4Nano33BLE
   * Calliope mini
   * Calliope mini blue
   * Calliope mini 2016
   * Robotino
   * 
   
 * help
   * general help
   * FAQ
   * about the Open Roberta Lab
   * about the Open Roberta Project
   * show welcome note again
   * logging
   * Datenschutzerklärung privacy policy
   * Impressum publishing notes
   * keyboard shortcuts
   
 * login
   * login ...
   * Log in with user group ...
   * logout
   * Manage user groups ...
     
   * change ...
   * delete user ...
   * state information
   * Add or mody notifications
 * tutorials
 * gallery
   
 * languages
   * 
   * 
   * 
   * 
   * 
   * 
   * 
   * 
   * 
   * 
   * 
   * 
   * 
   * 
   * 
   * 
   * 
   * 
   * 
   * 
   * 
   
 * 
 * Program
 * Robot configuration
 * Neural Network



 * Program NEPOprog
 * Robot configuration EV3basis
 * Neural Network NEPOnn
 * Listing of programs
 * Listing of configurations
 * Logging
 * Source code editor
 * Galery
 * Tutorial
 * UserGroup List
 * UserGroup Member List

start   ✓show sensor data


 * 1
 * 2

Action

Sensors

Control

Logic

Math

Text

Colours

Variables

 * 10
 * 20
 * 30
 * 40
 * 50
 * 60
 * 70
 * 80
 * 90
 * 99

   --------------------------------------------------------------------------------

 * 

 * 
 * 
 * 

   --------------------------------------------------------------------------------

 * 

 * 
 * 
 * 

   --------------------------------------------------------------------------------

 * 







»PROGRAM START«

Each program starts with the red »Program start« block.

This block is always available in the Open Roberta Lab and cannot be deleted.
The little triangle below the start block is called »sequence connector«. The
first block you want to use will be connected by using the »sequence connector«
at the start block. The sequence connector color changes to yellow when a
suitable block comes into its range.

Settings:

 * create a new global variable
 * delete the global variable
 * show sensor data - while running a program the current values of connected
   sensors will be shown on the display


If global variables have been created:

 * Text, name of the variable
 * Type of the variable, »Number«, »Boolean«, »String«, »Color«, »Connection«,
   »List Number«, »List Boolean«, »List String«, »List Connection«
 * Value, that corresponds to the variable type. This is the initial value of
   the variable.


»MOTOR PORT ... ON«

With the »motor port ... on« block you can program the speed (velocity) of the
selected motor. Your robot starts the selected motor, until it is stopped or
another block specifies new moving parameters.

Options and Arguments:

 * motor port, choose the port where the motor is connected to.
 * value, speed between -100 to 100. Negative values let the motor turn
   backwards. This value will be internally clipped to be between -100 and 100.


»MOTOR PORT ... ON ... FOR«

With the »motor port ... rotation« block you can program the speed (velocity) of
the selected motor. Your robot starts the selected motor and rotates the motor
until the specified number of rotations or degrees is done.

Options and Arguments:

 * motor port, choose the one where the motor that you want to program is
   connected to.
 * number, spped between -100 and 100. 100 is the maximum speed. Negative values
   lets the motor rotate into the other direction. This value will be internally
   clipped to be between -100 and 100.
 * rotation or degree. Choose the one which fits best. 1 rotation is the same
   than 360 degrees.
 * number, rotations or degrees, only positive numbers are allowed.


»GET SPEED MOTOR PORT«

The block »get speed motor port « reads the speed (velocity) of the selected
motor. The motor can have a speed from -100 (rotating backwards) to 100.

Options and Arguments:

 * motor port, choose the port where the motor is connected to.


Return value:

 * number, the current speed of the motor.


»SET MOTOR PORT SPEED«

The block »set motor port ... speed« sets the speed (velocity) of one selected
motor to a new value.

Options and Arguments:

 * motor port, choose the port where the motor is connected to.
 * number, speed between -100 and 100. Negative values let the motor run
   backwards. This value will be internally clipped to be between -100 and 100.


»STOP MOTOR PORT«

Using the block »stop motor port « switches off one selected motor. You can
decide the motor to run out slowly (float) or to break immediately

Setting options:

 * motor port, choose the port where the motor is connected to.
 * float or brake; make your choice.


»DRIVE«

With the »drive« block you can program the direction and also the speed
(velocity) of your robot. Your robot moves until it is stopped or another block
specifies new driving parameters. The driving speed can be set in the field
»speed«.

Options and Arguments:

 * direction, forwards or backwards. Choose the direction.
 * number, speed between -100 to 100. 100 is the maximum speed. Negative values
   lets the motor rotate into the other direction. This value will be internally
   clipped to be between -100 and 100.


»DRIVE DISTANCE«

With the »drive distance« block you can program the direction and the speed of
the robot. The speed of your robot is set in the »speed« parameter. Once the
block has been executed the motors stop automatically.

»drive distance« controls both motors of the robot at the same time, meaning
that the settings you make here apply to both motors of the robot. If the
robot's actions don't correspond with the block's settings when running the
program, check the robot configuration settings, especially the wheel diameter
and the track width.

Settings and input values:

 * Drive, »forwards« or »backwards«. Select a direction.
 * Number, speed between -100 and 100. If the number is negative, the motors
   will rotate backwards. This value will be internally clipped to be between
   -100 and 100.
 * Number, the distance to drive in cm.


»STOP«

The »stop« block stops the motors immediately.

Settings: none


»TURN«

With the »turn« block you set the direction (right/left) which the robot will
turn. Your robot turns until it is stopped or another block is used for driving.
You can set the speed in the block parameter field »speed«.

»turn« controls both motors of the robot at the same time, therefore the robot
turns on the spot. If the EV3 Robot's actions don't correspond with the block's
settings when running the program, check the EV3 robot configuration settings,
especially the wheel diameter and the track width.

Settings and input values:

 * Turn, »right« or »left«. Select the desired direction for turning.
 * Number, speed between -100 and 100. If the number is negative, the robot will
   turn the other way around. This value will be internally clipped to be
   between -100 and 100.

If your robot turns into the wrong direction, then the motors are connected to
the wrong ports. Just swap the ports and your robot will turn into the right
way.


»TURN DEGREE«

With the »turn degree« block you program the direction (right/left) that your
robot will turn. In addition to the direction you can also program the
»degrees«, allowing you to program how many degrees your robot should rotate
(around its axis). This means that you do a complete rotation by setting a 360
degree turn..

The »turn degree« block controls both motors of the robot in such a way that the
robot turns around its own axis. If the robot's actions don't correspond with
the block's settings when running the program, check the EV3 robot configuration
settings, especially the wheel diameter and the track width.

Settings and input values:

 * Turn, »right« or »left«. Select the desired direction for turning.
 * Number, speed between -100 and 100. If the number is negative, the robot will
   turn the other way around. This value will be internally clipped to be
   between -100 and 100.
 * Number, degrees the robot shall turn. Degree of 360 will perform a full turn
   around. Negative numbers are not allowed.


»STEER ... SPEED LEFT ... SPEED RIGHT ...«

The block »steer ... speed left ... speed right ...« programs the robot to drive
a curve by setting different speeds for the left and right motor. The robot
configuration influences the radius of the curve depending from wheel distance
and wheel diameter. The turning direction will define the driving direction.

Settings and input values:

 * Turning direction, »forwards« or »backwards«. Select your desired moving
   direction.
 * Number, speed between -100 and 100 for the left motor. If the number is
   negative the motor will run backwards. This value will be internally clipped
   to be between -100 and 100.
 * Number, speed between -100 and 100 for the left motor. If the number is
   negative the motor will run backwards. This value will be internally clipped
   to be between -100 and 100.



»STEER ... SPEED LEFT ... SPEED RIGHT ... DISTANCE ...«

The block »steer ... speed left ... speed right ... distance ...« programs the
robot to drive a curve by setting different speeds for the left and right motor
and also a distance related to the middle between both wheels. The robot
configuration influences the radius of the curve depending from wheel distance
and wheel diameter. The turning direction will define the driving direction.

Settings and input values:

 * Turning direction, »forwards« or »backwards«. Select your desired moving
   direction.
 * Number, speed between -100 and 100 for the left motor. If the number is
   negative the motor will run backwards. This value will be internally clipped
   to be between -100 and 100.
 * Number, speed between -100 and 100 for the left motor. If the number is
   negative the motor will run backwards. This value will be internally clipped
   to be between -100 and 100.
 * Number, the distance in cm to be driven.



»SHOW TEXT«

With the »show text« block you can display text and numbers on the display of
your robot. You can also specify in which column and row the text or numbers
should be displayed on the robot screen.

The EV3 display contains some rows and columns, counted from 0 in the top left
corner.

If there was text on the display prior to the show text block then the former
text will be overwritten.

Input values:

 * String, input of a text string to be shown in the display.
 * Number, column for the text to start between 0 and 17.
 * Number, row for the text to start between 0 and 7.


»SHOW PICTURE«

With the »show picture« block you can show one of some stored pictures on the
EV3 display of your robot. Avaliable pictures are »glasses«, »eyes open«, »eyes
closed«, »flowers«, »tacho«.

Settings and input values:

 * Picture, select one of the available.
 * Number for x, column, where the picture shall start.
 * Number for y, line, where the picture shall start.


»CLEAR DISPLAY«

With the »clear display« block you can delete text and numbers on the display of
your robot, therefore nothing appears on your display.

Settings: none


»PLAY FREQUENCY«

With the »play frequency« block you can program the frequency (pitch level) and
the time (how long the sound should be played) that a sound is played. The sound
is played by the built-in speaker of your LEGO MINDSTORMS EV3 brick for a
defined of time. The frequency setting corresponds directly to the frequency in
Hertz, for example, setting the frequency to 400 corresponds to 400 Hertz.
Example: 261 = C.

Note that the human ear can perceive frequencies from about 30Hz to about
15,000Hz (15kHz). This can vary depending on the person and their age.

Settings:

 * Number, desired frequency in Hz (Hertz) .
 * Number, desired duration in milliseconds (ms).


»PLAY NOTE ... «

With this block you can make a robot play a note.

Options:

 * Option, choose the duration of the note.
 * Option, choose the note that the robot should play.



»PLAY FILE«

With the »play file« block your robot plays one of five stored sounds.

Settings:

 * Option, choose between one of the following files:
   1 = single beep
   2 = double beep
   3 = increasing sound of 4 tones
   4 = decreasing sound of 4 tones
   5 = single low tone


»SET VOLUME«

With the »set volume« block you can program the sound volume played. The volume
ranges from 0 (no sound) to 100 (full volume). The volume setting remains
unchanged until you change it with another »set volume« block.

Setting:

 * Number, volume for loudness. 0 = no tone, 100 = maximum volume. This value
   will be internally clipped to be between 0 and 100.


»GET VOLUME«

With the »get volume« block you can read the currend sound volume level.

Return value:

 * Number, currently adjusted volume. 0 = no tone, 100 = maximum volume


»SET LANGUAGE ... «

With this block you can control the language of your robot. If you are using
C4EV3 as your robot system, you will need to download additional files for the
speech. You can find instructions here.

Options:

 * Option, choose the language.



»SAY TEXT ... «

With this block you can control the voice output of your robot. The robot uses
the language you set with the "Set Language..." block. The default language is
German.

Input values:

 * String, the text you want your robot to say.



» SAY TEXT ... VOICE SPEED ... VOICE PITCH ... «

With this block you can control the voice output of your robot. You can also
control your robot's voice pitch and speaking speed.

Input values:

 * String, text your want your robot to say.
 * Number, speaking rate in percent, i.e. my number between 1 and 100, the
   higher the number, the faster the robot speaks. This value will be internally
   clipped to be between 0 and 100.
 * Number, voice pitch of the robot in percent. Number between 1 and 100, the
   higher the number, the higher the voice pitch of the robot. This value will
   be internally clipped to be between 0 and 100.



»BRICK LIGHT«

With the »brick light« block you can program the background light of the EV3
buttons. In addition to color, you can also turn on and off the EV3 brick light.
The EV3 brick light stays on until you reprogram it. The following colors are
available: »green«, »orange« or »red«.

Settings:

 * Colour, select a colour.
 * Flash type, »on«, »flashing« or »double flashing«. Select a flash type for
   the brick light.


»BRICK LIGHT OFF«

With the »brick light off« block you can turn off the brick light.


»RESET EV3 BRICK LIGHT«

With the »reset EV3 brick light« block you can reset EV3 brick light back to the
default settings.

Settings: none


»TOUCH SENSOR«

With the block »touch sensor« you can "tell" another block whether the touch
sensor is pressed or not. This block returns the logical values true = pressed
or false = not pressed. This block can only be used in conjunction with another
block which requires a logical value as an input parameter, for example together
with the »if then« block.

Settings:

 * Port, select the sensor port where your touch sensor is connected.


Return value:

 * Boolean value: »true«, if the touch sensor is pressed, otherwise »false«.


»GET DISTANCE/PRESENCE« ULTRASONIC SENSOR

With the block »get distance/presence« you "tell" another block the distance the
ultrasonic sensor measures. The distance is transmitted as a number (in cm). In
addition, this block can be set to "presence" in the drop down menu. This
setting can check whether another ultrasonic sensor is active. This setting
specifies the logical values true = another ultrasonic sensor is present or
false = no other ultrasonic is present back.

Ultrasound, which was not sent by the own ultrasonic sensor, can result in
erroneous measurements.

Settings:

 * Presence or distance; »presence« means that the presence of another
   ultrasonic sensor will be checked. »Distance« means that the ultrasonic
   sensor measures the distance to the next obstacle.
 * Port, select the sensor port where your ultrasonic sensor is connected.


Return value:

 * If »presence« was selected, a boolean value: »true«, if another ultrasonic
   sensor was detected, otherwise »false«.
   
   If »distance« was selected, a number, indicating the distance between the
   ultrasonic sensor and an obstacle in cm.


»GET COLOUR LIGHT SENSOR / COLOUR SENSOR PORT ... «

With the block »get colour« you can "tell" another block which color the light
sensor measures. The color is transmitted as type »colour« . In addition, this
block provides within the drop down menu the settings »light«, »RGB« and
»ambient light«. These three additional settings transmit all the same type
»number«. The numerical values are between 0 (black) to 100(white). With these
various settings this block can be configured according to the specific
requirements.

In mode »colour« the light sensor emits light and detects the basic colour under
the sensor. Values for basic colours are BLACK, WHITE, RED, GREEN, BLUE, YELLOW,
BROWN. The colour GREY means, that the registered colour doesn't match any of
the predefined ones.

In mode »light« the light sensor emits light with its red LED and measures the
light intensity of the reflected light on a scale of 0 to 100.

In the mode »RGB« the light sensor emits red, green and blue light and measures
the reflected light corresponding to the components red, green and blue on a
scale from 0 to 100 for each color. A list of three numbers is returned.

In mode »ambient light« the same scale (0-100) as in the mode light is used.
Here, the ambient light inciding the sensor is measured.

Settings:

 * Mode of measurement, select the mode of measurement.
 * Port, select the sensor port where your light/colour sensor is connected.


Return value:

 * Value, depending on the selected ode of measurement.


»GIVE DISTANCE/PRESENCE« INFRARED SENSOR

With the block »give distance/presence« for infrared sensor you can "tell"
another block which distance the infrared sensor measures.

Working in the "distance" mode the distance is transmitted as a number with
values between 0 (very close) and 100 (far away). In this mode the sensor
detects objects in a distance up to 70 cm.

In addition, this block can be set to "presence" mode in the drop down menu.
With this setting you can check whether an infrared sender/beacon is active.
This setting returns a list of 4 pairs of values, i.e. 8 numbers. Each pair of
values indicates an orientation value and a distance value of the infrared
sender. The first pair of values is related to channel 1 of the sender, the
second pair to channel 2 etc. Orientation values are between -25 and +25. The
value of 0 indikates that the infrared signal comes directly from the front.
Values out of the -25/+25 range represent angles of 110° to the left or right,
respectively. The distance value of the sender is a relative value between 0
(very close) and 100 (far away). Infrared signals may be detected from a maximum
distance of 200 cm.

Example: Result of an infrared sensor measure is [ 0 0 -10 40 0 0 0 0 ]. This
means that on channel 2 the direction of the sender/beacon gives a value of -10,
which is about 60 degrees to the left, while the distance value of 35 has been
found, which represents nearly 70 cm.

An exact measurement of distances in cm is not possible with the infrared
sonsor.

Settins:

 * »Distance« or »presence«. Select the measuring mode for the infrared sensor.
 * Port, select the sensor port where your infrared sensor is connected.


Return value:

 * »Distance« mode: number indicating the distance in cm, maximalum distance is
   70 cm.
   
   »Presence« mode: list of numbers.


»RESET ENCODER«

With the block »reset encoder« the internal sensor (motor encoder) of a motor
can be reset to 0 .

Setting:

 * Port, select the sensor port where your motor is connected.


»GET ROTATION/DEGREE« ROTATION SENSOR

With the block »get rotation/degree« you can "tell" another block the rotation
of the motor. The distance is transmitted as a number (in cm). In addition, this
block can be set to »degree« in the drop down menu. With this setting the number
of degrees is transmitted instead of cm. This block can only be used in
conjunction with another block, which requires a number as an input parameter.

Settings:

 * Measurement mode, »rotation«, »degree« or»distance«. Select your mode of
   measurement.
 * Encoder port, select the sensor port where your motor/encoder is connected.


Return value:

 * Number, that indicates according to the measurement mode the number of
   rotations, the degrees, or the distance in cm.


»BUTTON« EV3 BUTTONS

With the block »button« you can "tell" another block whether the selected button
is pressed or not. Available buttons are »enter« / »up« / »down« / »left« /
»right« / »escape« / »any«. This block returns logical values true = pressed or
false = not pressed.

Settings:

 * Button, select the button you want to check.


Return value

 * Boolean value, »true«, if the selected button has been pressed, »false«
   otherwise.


»RESET GYROSCOPE«

With the block »reset gyroscope« the gyroscope (also called gyro sensor) can be
reset to 0.

Settings:

 * Port, select the sensor port where your gyroscope is connected.


»GET ANGLE/RATE« GYROSCOPE

With the block »get angle/rate gyroscope« you can "tell" another block the angle
in which the gyro sensor was rotated around its vertical axis. The angle is
transmitted as a number. Alternatively the return value can be set to »rate« in
the drop down menu. This setting allows to send the rotation rate of the sensor
in "degrees per second" instead of the angle.

In mode »rate« a maximum of 440 degrees/second can be captured. In mode »angle«
the accuracy of the gyro sensor is +/- 3 degrees.

Settings:

 * Measurement mode: »angle« oder »rate«
 * Port, select the sensor port where your gyroscope is connected.


Return value:

 * Number, depending from the mode of measurement an angle in degrees or the
   rate of turns per second.


»GET VALUE« TIMER

With the block »get value« you can "tell" another block the current time in
milliseconds of the internal timer. 5 timers are available.

Setting:

 * Option, select the timer you want to read.


Return value:

 * Number, milliseconds since program start or since the last reset of the
   selected timer.


»RESET TIMER«

With the block »reset timer« the internal timer (1 to 5) can be reset to the
value 0.

Setting:

 * Timer number, select the timer you want to reset.


»GET SOUND % SOUND SENSOR PORT ... «

This block allows you to query the volume that the sound sensor measures.

Options:

 * Option. choose the Port the sensor is connected to.


Return value:

 * Number, the volume of the robots surroundings in percent.



»CALIBRATE HT COMPASS SENSOR PORT... «

Use this block to recalibrate a connected HT compass sensor. This sensor
measures the earth's magnetic field and calculates a current orientation of your
robot from its course. In order for this calculation to be as accurate as
possible, you must recalibrate the compass sensor at the beginning of your
program to reduce disturbing influences such as motors.

Options:

 * Option, choose the port your sensor is connected to.



»GET ... HT COMPASS SENSOR PORT ... «

With this block you can request different values of the compass sensor. The
compass sensor can measure the angle and compass orientation of your robot.
However, you should recalibrate the sensor before using it in your program.

Options:

 * Option, select the property you want to measure. Either the angle of your
   robot or the compass orientation.
 * Option, choose the port your sensor is connected to.

Return value:

 * Number, either the angle of your robot or the compass orientation. Number
   between 0 and 359.


»GET ... HT INFRARED SENSOR PORT ... «

With this block you can poll the HT infrared sensor of your robot. This sensor
sends and receives infrared signals and can calculate the distance to an object.

Options:

 * Option, choose between a modulated or an unmodulated signal.
 * Option, choose the port your sensor is connected to.


Return value:

 * Number, distance to the nearest object in centimeters.



»GET ... HT COLOUR SENSOR PORT ... «

With this block you can query the HT color sensor of your robot. This sensor
uses several light emitting diodes to illuminate the background and then
measures which color is reflected how much. From these values you can calculate
colors and RGB values. The sensor can also measure the brightness of the
background and the environment.

Options:

 * Option, select which property you want to measure. You have the choice
   between color, light, ambient light and RGB splitting.
 * Option, choose the port your sensor is connected to.


Return value:

 * Colour, the colour of the underground.
   
   Number, the brightness of the underground or surroundings.
   
   List of numbers, splitting the color of the background into red, green and
   blue.



»IF DO«


With the block »if do« you can selectively trigger actions to be executed by
your robot. The »if do« block therefore requires a logical value as an input
parameter, the condition. Only if the condition of the »if« statement is true,
the inserted block will be executed. In a nested »if do« block, if a further
distinction was added, the first »if« condition is queried. If it is not
fulfilled (condition = false), the second »else if« condition will be checked.
Also this second condition requires a logical value as an input parameter.

The conditions may arbitrarily be expanded by clicking the "+" plus symbol. The
"-" minus symbol reduces the block.

Settings and input values:

 * Insert an additional condition.
 * Delete the last condition.
 * Boolean value, »true« or »false«.
 * Blocks that will be executed


»IF DO ELSE«

With the block »if do else« you can selectively trigger actions which are
executed by your robot. The »if do then« block therefore requires a logical
value as an input parameter. If the condition in »if« is true the inserted block
will be executed, otherwise (condition is not fulfilled = false) the block
connected to the »else« statement will be executed. In a nested »if do else«
block with further distinctions added, the first »if« condition is queried. If
it is not true, the second condition »else if« is checked. Also the second
condition requires a logical value as an input parameter. Only when both
conditions are not true, the block which is inserted at the »else« statement
will be executed.

The conditions may arbitrarily be expanded by clicking the "+" plus symbol. The
"-" minus symbol reduces the block.

Settings:

 * Insert an additional if-do-else condition.
 * Delete the last if-do-else condition.
 * Boolean value, »true« or »false«.
 * Do blocks that will be executed if the according condition evaluates to
   »true«.
 * Else blocks that will be executed if the according condition evaluates to
   »false«.


»REPEAT INDEFINITELY«

With the block »repeat indefinitely« you can endlessly run the blocks on your
robot. All blocks which are within the »repeat indefinitely« block will be
executed endlessly. The blocks are applied sequentially from top to bottom. Once
the last block has been executed, the program repeats with the first block
again. Therefore, this block is also called »loop«.

Input:

 * Blocks to be repeated indefinitely.



»REPEAT N TIMES«

With the block »repeat« you can run other block as many times as you like. All
blocks in the »repeat« block will be executed as often as defined in the entry
field. The blocks are applied sequentially from top to bottom. Once the last
block has been executed, the program repeats with the first block again.
Therefore, this block is also called »loop«.

Only integer values can be entered.

Settings and input:

 * Number that indicates how often the contained blocks will be repeated.
 * Blocks to be repeated as often as defined.



»WAIT«

With the block »wait« you can "pause" your program at the point where you
inserted the »wait« block. Your program will then remain for the specified
duration at this point. After the specified time the next block will be
executed. For example you can display text in the screen of your robot for
exactly the time you specified in the »wait« block.

Settings and input values:

 * Number, waiting time in milliseconds.


»WAIT UNTIL ...«

With the block »wait until« you can "stop" your program at the point you insert
the »wait until« block. Your program then waits until the condition is true. The
»wait until« block you can extended by click on "+" symbol. Your program then
waits until (at least) one of the condition of your »wait until« block is true.

Settings:

 * Add a new condition.
 * Delete the last condition.
 * Boolean value, »true« or »false«.


»WAIT UNTIL ... «

With the block »wait until« you can "stop" your program at the point you insert
the »wait until« block. Your program then waits until the condition is true. The
»wait until« block you can extended by click on "+" symbol. Your program then
waits until (at least) one of the condition of your »wait until« block is true.

Settings:

 * Add a new condition.
 * Delete the last condition.
 * Boolean value, »true« or »false«.


»BREAK OUT/CONTINUE WITH NEXT ITERATION OF LOOP«

With the block »break out/continue with next iteration of loop« a loop can be
terminated ahead of schedule. As soon as the block is entered within a sequence
of blocks, all further blocks up to the end of the loop will be ignored.

Settings:

 * Type of breaking behavior, »break out« or »continue with next iteration«.


»COUNT WITH FROM TO«

With the block »count with from to« you can run other block as many times as you
like. All blocks in the »count with from to« block will be executed as long as
the counting is in progress. The blocks are applied sequentially from top to
bottom. Once the last block has been executed, the program repeats with the
first block again if the counting is in progress. The last parameter declares
the step width for counting.

Settings:

 * Variable, name of free choice; numbers of the counter will be delivered one
   after the other to the variable.
 * Number, initial value of the counter.
 * Number, final value of the counter. As the counter exceeds this value the
   loop ends.
 * Number, defining the increment. The variable value will increase by this
   amount after every loop cycle.
 * Blocks that will be executed in every loop cycle.


»FOR EACH ITEM IN LIST«

With the block »for each item in list« all list items will successively be bound
to a variable. The variable can be used within the loop. With each loop cycle
the next item of the list will be bound until all list elements have been
processed.

Settings and input value:

 * Type of list elements, »Number«, »String«, »Boolean«, »Colour«, »Connection«
 * Variable, name of free choice; list elements will be delivered one after the
   other to the variable.
 * List that contains elements of the desired type. If the list elements are not
   of the correct type then the list will not fit to the input slot.
 * Blocks which will be executed as often as there are elements in the list.


»REPEAT WHILE/UNTIL«

With the block »repeat while/until« you can run other block as many times as you
like. All blocks in the »repeat while/until« block will be executed as long as
the condition in the entry field is true. The blocks are applied sequentially
from top to bottom. Once the last block has been executed, the program repeats
with the first block again if the condition is still true. Therefore, this block
is also called »conditional loop«.

Settings and input values:

 * Option, »while« or »until«, defining the type of the conditional repetition.
 * Boolean value, »true« or »false«.
 * Blocks that will be repeated while/until the condition evaluates to »true«.


»COMPARISON«

With the block »comparison« you can compare different parameters of the same
type (number, color, logical value, text). This block can only be used in
conjunction with another block which requires a logical value as an input
parameter.

Settings and input values:

 * Value for the left hand side.
 * Comparison, select one of =, ≠, <, ≤, >, ≥
 * Value for the right hand side.

Return value:

 * Boolean value, »true« or »false«.


»AND/OR«

With the block »and/or« you can interrelate logical values with each other. The
»and/or« block with the setting "and" will be true only if both logical
parameters are "'true"'. If the block has the setting »or« it is sufficient if
one of the two parameters is "true", so that the »and/or« block will return
true.

Settings:

 * Boolean value on the left hand side.
 * Boolean function, »and« or »or«.
 * Boolean value on the right hand side.


Return value:

 * Boolean value »true« or»false«.


»TRUE/FALSE«

With the block »true/false« you can return either the logical value »true« or
»false« to another block.

Settings:

 * Boolean value, make your choice.


Return value:

 * Boolean value, »true« or »false«.


»NOT«

Using the »not« lets you invert a logical value and pass this value to another
block.

Input value:

 * Boolean value, to be inverted.


Return value:

 * Boolean value, »true« or »false«; result of inverting.


»TEST«

Using the »test« block will perform a test and returns a value which depends on
the test result.

Input values:

 * Boolean value for the test; if no input value is given "true" will be
   assumed.
 * Arbitrary value, evaluated by a block.
 * Arbitrary value, evaluated by a block.


Return value:

 * Value of arbitrary type.


»NULL«

The block »null« is a place holder for an input value that is not yet specified.
If for instance a new connection variable has been created and is not yet bound,
the initial value of this connection will be set to »null«.

Return value::

 * Boolean value, »null«.


»PARAMETER«

With the block »parameter« you can send numbers to another block.

Settings and input values:

 * Number

Return value:

 * Number



»CALCULATING«

With the block »calculating« you can sum up, subtract, multiply, and divide
numbers. This block can only be used in conjunction with another block which
requires a number as an input parameter.

Settings and input values:

 * Number, first number on the left you want to calculate with.
 * Option, mathematical operator, choose one of +, −, ×, ÷, ^.
 * Number, second number on the right you want to calculate with.


Return value:

 * Number, result of the calculation.


»MATHEMATICAL FUNCTION«

With the block »mathematical function« some elementary mathematical functions
may be calculated. Available functions are »square root«, »absolute«, »invert«
(multiply by -1), »ln« (natural logarithm), »log10« (decadic logarithm), »e^«
(exponential function), »10^« (base 10 exponent)

Settings and input value:

 * Option, mathematical function, choose one.
 * Number to apply the function to.


Return value:

 * Number, result of the function application.


»TRIGONOMETRIC FUNCTIONS«

With the block »trigonometric function« sine, cosine, tangent and their
respective revers functions can be calculated. Input values are expected in
radian measure(see hint above).

Settings and input value:

 * Option, trigonometric function to choose from.
 * Number, in radian measure.


Return value:

 * Number, result of the trigonometric calculation.


»CONSTANT«

With the »constant« block some mathematical constant values are available: »π«
(3,1415...), »e« (2,718...), »φ« (1,618...), »sqrt(2)« (1,414...), »sqrt(½)«
(0,7071...), »∞«

Settings:

 * Option, mathematical constants, choose one.


Return value:

 * Number, value of the selected mathematical constant. Infinity will return
   »infinity«.


»NUMBER PROPERTY«

With the block »number property« you check whether a given number has a specific
property: »even«, »odd«, »prime«, »whole«, »positive«, »negative«, »divisible
by«.

Settings and input values:

 * Number, the property of this input value will be checked.
 * Option, number property, choose one.
 * Number, evaluated from a block. The second input value is only required for
   the property »divisible by«.


Return value:

 * Boolean value, »true« or »false«, depending on the selected property.


»CHANGE BY ... «

The block »change by ... « increments a numerical variable by a defined value.

Settings and input values:

 * Variable name, which value is to be changed. Choose the variable to be
   changed.
 * Number, given by a block.


»ROUND«

With the block »round« values may be rounded. Rounding will set the decimal
places to 0. It depends on the value of the decimal places whether the block
rounds up or down. You may also decide by settings to always round up or down.

Settings and input value:

 * Type of rounding, choose a round mode.
 * Number you want to round.


Return value:

 * Number, rounded whole number, according to the round mode.


»LIST EVALUATION«

With the block »list evaluation« you may analyse a list.

Modes for list evaluation:

 * sum - addition of all list values
 * min - smallest value in the list
 * max - largest value in the list
 * average - average of all list values
 * median - median of all list values
 * standard deviation - standard deviation of all list values
 * random item - one list value randomly selected


Settings and input value:

 * Mode of list evaluation, choose one mode.
 * List of numbers


Return value:

 * Number, calculated according to the selected list evaluation mode.


»REMAINDER OF«

The block »remainder of« calculates a divison and returns the remainder of the
division.

Input values:

 * Number to be divided (dividend).
 * Number, divisor.


Return value:

 * Number, rest of the division.


»CONSTRAIN«

The block »constrain« ensures that given boundaries will not be exceeded.

Input values:

 * Number, that will be constrained.
 * Number, lower bound.
 * Number, upper bound.


Return value:

 * Number, constrained by the lower and the upper bound.


»RANDOM INTEGER«

With the block »random integer« you may generate random integer numbers within
defined limits

Input values:

 * Number, lower bound
 * Number, upper bound


Return value:

 * Number, a whole random number from within the upper and lower bounds.


»RANDOM FRACTION«

With the block »random fraction« a random value between 0.0 and 1.0 is
calculated.

Return value:

 * Number, positive random value between 0.0 and 1.0.


»CAST ... TO STRING«

This block converts a number into a string containing that number. So for
example the number 123 would be converted into the string »123«.


Options and input values:

 * Number, the number that you want to convert into a String containing this
   number.


Return value:

 * String, the string containing the selected number.



»CAST ... TO CHAR«

This block converts a single number to the corresponding ASCII letter. If there
is no associated ASCII character for this number, an empty string is passed on.
So for example the number 97 gets converted into the lower-case letter »a«.

Options and input values:

 * Number, the ASCII code that you want to convert into a character.


Return values:

 * String, a single character that corresponds to the selected ASCII number.



»TEXT«

The simple »Text« block creates a little text.

Input value:

 * String, containing arbitrary characters.


Return value:

 * String, containing arbitrary characters.


»COMMENT«

Document your program with this block, so that you and others will find it
easier to understand your program later. This comment will also be visible in
the generated source code.

Input value:

 * String, containing arbitrary characters.


»CREATE TEXT«

The »create text« block compiles a text from different input parameters. Using
the + sign will insert further input slots. All input parameters will be
connected one after the other. Essentially the »create text« block converts an
arbitrary input value into a text string.

Input values:

 * Arbitrary values [numbers, text, logical values, colours)


Return value:

 * String, containing arbitrary characters, compiled sequentially from all input
   values.


»APPEND TEXT«

The »append text« block will append some string to a given string, for instance
to extend a message with a signature.

Input values:

 * String, to which some other text will be appended.
 * String, that shall be appended.


»CAST ... TO NUMBER«

This block converts a string into a number if this is possible. So if a string
contains only numbers, this block can convert the string into a number. If the
block does not contain numbers, this block will pass »NaN« when used in th Open
Roberta Lab simulation and may have a different behavior depending on the
programming language of the robot you are currently using. If the string starts
with numbers but then contains other characters that are not numbers, this block
will pass only the numbers and stop as soon as the first character is in the
string. So, as an example, this block makes the number 52 out of the string
»52abcd«.

Options and input values:

 * String, the string you want to convert into a number.


Return values:

 * Number, the converted number.



»CAST ... AT INDEX ... TO NUMBER«

This block converts a letter or a character from a character string into the
corresponding ASCII number. Each character has an associated number in the ASCII
table. For example, a lower-case »a« is converted into the number 97.

Options and input values:

 * String, from which a single character is selected.
 * Number, the digit of the character to be converted. Note that the numbering
   starts at 0.


Return values:

 * Number, the ASCII number of to selected character. Number between 0 and 255.



»CREATE LIST«

The block »empty list« creates a list with no content.The block »list« generates
a list with some predefined values.

This block may only be used in the context of a »set variable« block.

Using »+« or »−« enables you to extend or reduce the list at its end.

Settings and input values:

 * List type, »Number«, »String«, »Boolean«, »Colour«, »Connection«.
 * Create further list element, append to the end of the list.
 * Delete list element at the end of the list.
 * Values, according to the list type. Here the input of initial values is
   possible.


Return value:

 * Empty list or list, containing elements of the specified list type.


»REPEAT ELEMENT IN LIST«

The »repeat element in list« block generates a list of equal elements.

Settings and input values:

 * List type, »Number«, »Boolean«, »String«, »Colour« or »Connection«.
 * List element, according to the selected list type. This value will be
   repeated in the list.
 * Number, defining how often the list element will be repeated.


Return value:

 * List of the specified list type, containing the specified number of equal
   elements.


»LENGTH OF«

The »length of« block returns a value which is the length of the list given as
parameter. An empty list has a length of 0.

Input value:

 * List, evaluated by an appropriate block.


Return value:

 * Number, number of list elements.



»IS EMPTY?«

A list given as parameter will be checked whether it is empty.

Input value:

 * List, evaluated by an appropriate block.


Return value:

 * Boolean, either »true« or »false«.


»FIND IN LIST«

A list is searched for an item. If the item is in the list, the list position
will be returned. If the item is not in the list the result is -1.

Settings and input values:

 * List, that will be examined.
 * Position of the occurrence, either »first« or »last«.
 * Value, list item to be found.


Return value:

 * Number, indicating the position where the element was found in the list.
   
   Note: Counting list positions will start with 0.


»GET LIST ELEMENT«

This block accesses an item of a list. Depending on the settings this item may
be altered.

A list is given as parameter. Then a drop-down-list specifies what will happen
to the list item under consideration.

Settings:

 * List, that is under consideration.
 * Option, action for the element found: »get« reads the element and leaves it
   unchanged, »get and remove« reads the element and removes it from the list,
   »remove« just removes the element from the list.
 * Option, position of the element found: »#«, »# from end«, »first«, »last« or
   »random« .

 * Number, indicating the list position. This input value is not required if
   »first«, »last« or »random« was selected as position.
   
   Note: Counting of list positions starts with 0.


Return value:

 * List element that has been found at the specified list position; »undefined«,
   if the list position does not exist.
   
   With selection of »remove« there is no return value; instead the list will be
   shortened by this list element.


»SET LIST ELEMENT«

In a list given as input parameter one specified element will be replaced by a
new value.

Settings and input values:

 * List, that will be changed.
 * Option, action for the element found; »set« changes the element, »insert at«
   inserts a new element into the list.
 * Option, position for the element to be changed: »#«, »# from end«, »first«,
   »last« or »random« .
 * Number, indicating the list position. This input value is not required if
   »first«, »last« or »random« was selected.
   Note: Counting of list positions begins with 0.
 * List element, that will be set or inserted at the selected list position.


»GET SUBLIST«

From a list given as parameter a sublist will be created. The sublist contains
all those elements that match the further specifications of the block.

Settings and input values:

 * List to be examined.
 * Position, start of the sublist: »#«, »# from end« or »first«.

 * Number, indicating the list position. This input value is not required if
   »first« has been selected.
   
   Note: Counting of list positions starts with 0.

 * Position, end of the sublist: »#«, »# from end« or »last«.

 * Number, indicating the list position. This input value is not required if
   »last« has been selected.
   
   Note: Counting of list positions starts with 0.


Return value:

 * List, a sublist of the same type as the given list.


»COLOUR PICKER «

With this block you can choose from a pool of predefined colours for your robot.

options:

 * option, choose the colour you want to use.


Return value:

 * colour, your selected colour.



»COLOUR PICKER «

With this block you can choose from a pool of predefined colours for your robot.

options:

 * option, choose the colour you want to use.


Return value:

 * colour, your selected colour.



»COLOUR PICKER «

With this block you can choose from a pool of predefined colours for your robot.

options:

 * option, choose the colour you want to use.


Return value:

 * colour, your selected colour.



»COLOUR WITH RED ... GREEN ... BLUE ... WHITE ... «

With this block you can create your own colour by mixing red, green and blue.

Input values:

 * number, the red part in your color. Value between 0 and 255.
 * number, the green part in your color. Value between 0 and 255.
 * number, the blue part in your color. Value between 0 and 255.
 * number, the brightness of your color. Value between 0 and 255.



»COLOUR WITH RED ... GREEN ... BLUE ... «

With this block you can create your own colour by mixing red, green and blue.

Input values:

 * number, the red part in your color. Value between 0 and 255.
 * number, the green part in your color. Value between 0 and 255.
 * number, the blue part in your color. Value between 0 and 255.



»COLOUR WITH RED ... GREEN ... BLUE ... «

With this block you can create your own colour by mixing red, green and blue.

Input values:

 * number, the red part in your color. Value between 0 and 255.
 * number, the green part in your color. Value between 0 and 255.
 * number, the blue part in your color. Value between 0 and 255.



»SET VARIABLE«

Using the block »set variable« will assign a value to a variable. Depending on
the variable type the value may be assigned by an input connector.

Settings and input value:

 * Variable, which value is to be changed.
 * Value, new value for the variable, evaluated from a suitable block.


»GET VARIABLE«

Using the block »get variable« returns the value of a variable to another
block.The type of the output parameter is equal to the type that has been
assigned to the variable in the »start« block.

Settings:


 * Variable, that will be read. The value will not be changed by reading.


Return value:


 * Value, stored in the variable.



»FUNCTION BLOCKS WITH/WITHOUT INPUT PARAMETERS AND NO RETURN STATEMENT«

In a function block with/without input parameter and without return parameter a
sequence of program statements will be condensed. The input parameters will be
determined by the local variables of the function block. Local variables may be
generated by using the »+« sign of the function block. Local variables will not
be initialized.

If a function block contains an if-block the function may be terminated before
reaching it's end.

The function block is available in the »Functions« category immediately after
its definition. Using function blocks improves the readability of complex
programs.

Settings:

 * Function name, no special characters and white spaces allowed.
 * Generate new local variables, that will be assigned with the function call.
 * Delete the associated local variable.


 * The name of a function block has to start with a lower case letter. Special
   characters are not allowed in a function block name.

 * If the function block defines input parameters (local variables), all the
   parameter slots have to be occupied when calling the function.


»FUNCTION BLOCKS WITH/WITHOUT INPUT PARAMETERS WITH RETURN STATEMENTS«

In a function block with/without input parameter and with return parameter a
sequence of program statements will be condensed. The input parameters will be
determined by the local variables of the function block. Local variables may be
generated by using the »+« sign of the function block. Local variables will not
be initialized. After running through all the blocks of the function a value
will be returned.

If a function block contains an if-block the function may be terminated before
reaching it's end. An alternative value may be returned by the if-block.

The function block is available in the »Functions« category immediately after
its definition. Using function blocks improves the readability of complex
programs.

Settings:

 * Function name, no special characters and white spaces allowed.
 * Generate new local variables, that will be assigned with the function call.
 * Delete the associated local variable.
 * Data type for the return value; choose one data type.
 * Block, that returns a value of the defined data type.


Return value:

 * Value of the defined data type, evaluated in an appropriate block.


 * The name of a function block has to start with a lower case letter. Special
   characters are not allowed in a function block name.
 * If the function block defines input parameters (local variables), all the
   parameter slots have to be occupied when calling the function.


»IF BLOCK TO BE USED WITHIN A FUNCTION«

The if statement within a function is of special importance. As the function
sequence meets an if statement the validity of the condition will be checked.

IF STATEMENT WITHIN A FUNCTION WITH RETURN VALUE:

 * If the condition evaluates to »true« the rest of the function will be ignored
   and the function terminates. The second input value of the if statement will
   be returned. A possibly defined return value of the function will be ignored.
   The return value data type is determined by the return data type of the
   function definition.
 * If the condition evaluates to »false« the sequence of the function blocks
   will be continued. The return value of the function will be returned after
   reaching the end of the function.

IF STATEMENT WITHIN A FUNCTION WITH NO RETURN VALUE:

 * An if statement within a function without return value has just the if
   statement as input parameter.
 * If the condition evaluates to »true« the rest of the function will be ignored
   and the function terminates.
 * If the condition evaluates to »false« the sequence of the function blocks
   will be continued.

Settings and input values:

 * Boolean value, possibly evaluated by a condition.
 * Value of the specified data type.


Return value:

 * Value of the specified data type.




»FUNCTION CALL WITHOUT RETURN VALUE «

With this block you can call a previous defined function in your program.

Input values:

 * element, depending of the required input value of the function.


»FUNCTION CALL WITH RETURN VALUE «

With this block you can call a previous defined function in your program.

Input values:

 * element, depending on the required input value of the function.

Return value:

 * element, depending on the return value of the function.


CONNECT TO ROBOT NAME

A message interchange connection is initiated by an EV3 robot, like a telephone
call that is initiated by the caller. You need to know the name of the
communication partner.

The connection between two EV3 robots is stored in a global variable of type
"connection". As long as this global variable is valid the message connection is
available.

Step 1: Create a global variable of type "connection".

Step 2: Enter the name of an EV3 robot that is partner of the message exchange.

The connection variable of the communication partner will automatically be
initiated by using the expert block "wait for connection" (see below). The
connection variable will be initiated when the calling EV3 robot has established
the connection by using the block "connect to robot name".

Input value:

 * String, name of a robot to which a connection shall be started.


Return value:

 * Connection object, bound to a global variable.



DATA TO SEND VIA CONNECTION

A text message will be transferred using a global connection variable. The text
message will be entered in a text block. To give the connection information to
the EV3 robot the value of the global connection variable will be read.

Currently only strings can be sent via bluetooth.

Settings:

 * Message data type, »String«.
 * String, message to be sent.
 * Connection type, »Bluetooth«.
 * Connection variable, established for the connection.



DATA RECEIVED VIA CONNECTION

A text message will be transferred using a global connection variable. The text
message will be transferred into a text block. To give the connection
information to the EV3 robot the value of the global connection variable will be
read.

Settings and input value:

 * Message data type, »String«.
 * Connection type, »Bluetooth«.
 * Connection variable, established for the connection.


Return value:

 * String, content of the received message.



WAIT FOR CONNECTION

A message interchange connection is initiated by an EV3 robot, like a telephone
call that is initiated by the caller. A robot that is called is waiting for a
connection.

The connection between two EV3 robots is stored in a global variable of type
"connection". As long as this global variable is valid the message connection is
available.

Step 1: Create a global variable of type "connection".

Step 2: The value of the connection variable is set to the expert block "wait
for connection".

The connection variable will be set when the calling EV3 robot has initiated the
connection (see above: connect to robot name).

Return value:

 * Connection object that may be stored in a connection variable.


Impressum Imprint Datenschutzerklärung Privacy Policy Nutzungsbedingungen Terms
of Use


--------------------------------------------------------------------------------



--------------------------------------------------------------------------------


 
 * Huge
 * Normal
 * Small

 

      Font Color:

 * Black
 * Blue
 * Green
 * Orange
 * Red
 * Yellow







1.

my programs ...

Loading, please wait...
Program name

Creator



Creation date

Modification date





No matching records found



Showing 1 to 0 of 0 rows10
 * 10

records per page
 * ‹
 * ›



Loading, please wait...
Configuration name

Creator



Creation date

Modification date





No matching records found



Showing 1 to 0 of 0 rows10
 * 10

records per page
 * ‹
 * ›



Loading, please wait...
no.

type

message

3[[TIME]] 0 msec: load notifications2[[TIME]] 1 msec: clear user1[[INFO]] result
from server:
{"notifications.available":true,"rc":"ok","cause":"ORA_INIT_SUCCESS","server.version":"5.2.9","cmd":"clear","message":"ORA_INIT_SUCCESS","_version":"1","initToken":"9nz2n_ZD-1_J","server.time":1707443845779}



Showing 1 to 0 of 0 rows10
 * 10

records per page
 * ‹
 * ›



1.
Spike Prime / Robot InventorThymioWeDoEv3Open Roberta xNNNXTmicro:bitmicro:bit
V2micro:bit Joy-CarBot'n Roll NAOBOB3ROB3RTAsenseBoxmBotmBot 2EdisonBionics
KitBionic FlowerNepo4ArduinoNepo4Nano33BLECalliope miniRobotinoAll robots
Order by: Newest Oldest Program name Robot



Loading, please wait...

No matching records found



Showing 1 to 0 of 0 rows12
 * 12

records per page
 * ‹
 * ›



Loading, please wait...

No matching records found



Showing 1 to 0 of 0 rows10
 * 10

records per page
 * ‹
 * ›



Loading, please wait...

No matching records found
Name of the user group

members

shared programs

Creation date








Showing 1 to 0 of 0 rows10
 * 10

records per page
 * ‹
 * ›


Name of the user group



Loading, please wait...

No matching records found
user

Password








Showing 1 to 0 of 0 rows10
 * 10

records per page
 * ‹
 * ›


touch sensorgyroscopecolour sensorultrasonic sensorbig motorregulationyes
▾direction of rotationforwards ▾sideright ▾big motorregulationyes
▾direction of rotationforwards ▾sideleft
▾EV3wheel diameter5.6cmtrack width18cmSensor 1Sensor 2Sensor 3Sensor 4Motor AMotor BMotor CMotor D
Action

Sensors

0 1 2 3 4 *



×


WLAN CREDENTIALS

SSID

Password

Please note that the data provided in this dialog window is private and will not
be stored in the OpenRoberta lab; it will only be used for program creation and
during the compilation process. Make sure that for each new session you enter
these credentials again. Please keep in mind that exposing this information to
public may pose security risks. OK
×


LOGIN ...


CHANGE ...


NEW


RESET PASSWORD ...

Username

Password

OK
reset password ... new
Username

»IAmBotman« or »RobellaStracciatella«? Not everyone needs to know your real
name. Think of a cool nickname that you can easily remember.
Password

12345 is no secure password. Rather think of a safe combination of numbers and
letters that you will not forget.
Repeat password

Got it? Better make sure!
Name

Enter your real name here if you like. This is just for you, no one else will
see it.
E-Mail

This is voluntary! However, some functions of the lab are only available if you
have verified your account by e-mail. You are younger than 16? Please ask your
parents to help you out with one of their e-mail addresses.
Further information ...
Age
I am younger than 16! I am 16 or older than 16!
Are you under 16? Then please ask your parents to help you. They can specify
their e-mail address to confirm your account.
change password ... resend verification email Register now
login ... reset password ...
E-Mail

Send now
login ... new
×


CHANGE PASSWORD ...

The password for your account is not safe. Set your own password, so that only
you can login to your account.
Old Password

New Password

Repeat password

OK
×


LOG IN WITH USER GROUP ...


RESET PASSWORD ...

Name of the owner of the user group

Do not enter the real name of the owner of the user group here, but his username
instead.
Name of the user group

The user group to which you want to log in has a name. Enter it here.
Username

Enter the member id of your user here.
Password

OK
reset password ...

If you forgot your password, you can ask the owner of your user group to reset
the password to the initial password for you. It will be the password you had to
enter when you logged in first.

--------------------------------------------------------------------------------

Log in with user group ...
×


NOTIFICATIONS

UPLOAD


Send

--------------------------------------------------------------------------------

DOWNLOAD




ATTENTION




OK
×


SINGLE MODAL HEADER

Single Input


OK
×


CONNECT ...

Please, choose a robot


OK
×


FOUND ROBOTS

Loading, please wait...
Name








×


SELECT MULTIPLE PROGRAMS FOR THE SIMULATION



Ok Cancel
×


ABOUT THE OPEN ROBERTA LAB


The Open Roberta Lab is a cloud-based integrated programming environment that
enables children and adolescents to program easily different
robot/microcontroller systems. This platform is completely open source so taking
part is desirable! Both the software and the open source developer tools are
available via Fraunhofer servers.



The Open Roberta Lab is an open-source programming platform developed by
Fraunhofer IAIS within the initiative »Roberta – Learning with Robots«



Open Roberta was initiated in collaboration with Google Germany to reduce the
hurdles for students, teachers and schools programming educational robots.



As part of the project »AI Algorithms in Computer Science Education«, the
Ministry for Schools and Education of the State of North Rhine-Westphalia is
funding the integration of Artificial Neural Networks into the Open Roberta Lab
as well as the development of suitable learning content and materials on
Artificial Intelligence.


Impressum Publishing notes


Version beta 1.1.0
Cool I want to help
×


KEYBOARD SHORTCUTS

Ctrl/Cmd + E export program Ctrl/Cmd + I import program ... Ctrl + M my programs
... Ctrl/Cmd + S save Ctrl/Cmd + Shift + S save as ... Ctrl + R run on robot
OK
×


STATE INFORMATION

Username
Program :  ???
Robot configuration :  ???
NEPO-Blocks :  ???
OK
×


INFO

Name : 
System : 
State : wait disconnected busy
Voltage : 
Waiting time : 
OK
×


ATTENTION

Do you really want to delete the following program or programs?

If you delete a program you share with others, you delete it for everyone.

If you delete a program shared with you, you do not delete the program but the
sharing.

If you delete a program with the owner »Gallery«, you remove your program from
the gallery!



OK
×


ATTENTION

Do you really want to delete the configuration ?



OK
×
There is a new firmware version for your robot available. You can try to run
programs with the old version, but best bet is to update your robot now! You
just have to click »Update now«.
Update now
Release 5.2.9 Impressum Publishing notes
Datenschutzerklärung privacy policy

CHOOSE YOUR SYSTEM!

Nepo4Arduino
Nepo4Nano33BLE
Calliope mini
Robotino
Open Roberta Sim
Spike Prime / Robot Inventor
Thymio
WeDo
Ev3
Open Roberta xNN
NXT
micro:bit
micro:bit V2
micro:bit Joy-Car
Bot'n Roll
NAO
BOB3
ROB3RTA
senseBox
mBot
mBot 2
Edison
Bionics Kit
Bionic Flower
Nepo4Arduino
Nepo4Nano33BLE
Calliope mini
Robotino
Open Roberta Sim
Spike Prime / Robot Inventor
Thymio
WeDo
Ev3
Open Roberta xNN
NXT
micro:bit
micro:bit V2
micro:bit Joy-Car
Bot'n Roll
NAO
BOB3
ROB3RTA
senseBox
mBot
mBot 2
Edison
Bionics Kit
Bionic Flower
Nepo4Arduino
Nepo4Nano33BLE
Calliope mini
Robotino
 * 1
 * 2
 * 3
 * 4
 * 5
 * 6
 * 7
 * 8
 * 9
 * 10
 * 11
 * 12
 * 13
 * 14
 * 15
 * 16
 * 17
 * 18
 * 19
 * 20
 * 21
 * 22
 * 23
 * 24

EV3 leJOS 0.9.1
EV3 leJOS 0.9.0
EV3dev
EV3 c4ev3
Nepo4Arduino Uno
Nepo4Arduino Uno Wifi Rev2
Nepo4Arduino Nano
Nepo4Arduino Mega


DO YOU NEED HELP?


Would you like to get started, but do not know exactly how? We will show you the
first steps in an interactive tutorial.

take a tour
In our detailed help, we will explain everything you need, from building
instructions to frequently asked questions.

Open Roberta
Wiki

--------------------------------------------------------------------------------


Okay, don't show this window again and remember my choice with a bookmark.
×


SHARE

Loading, please wait...
Shared with





No matching records found





OK
×


SHARE

Loading, please wait...

No matching records found





OK Cancel
×


ATTENTION

Message to show
OK
×


ATTENTION

Message to show

×

×


SYSTEM VALUES




TIMER VALUES




SENSOR VALUES




VARIABLE VALUES


×


DOWNLOAD YOUR PROGRAM TO »$«

Connect your micro:bit device to the computer
select it in the next popup and click »Connect« Download your program as a file

0%





Okay, I've changed the download folder of my browser permanently. Don't show
this popup again and download my programs directly.
OK
×


CREATE NEW USER GROUP

Name of the user group


Automatically generated members

Automatically genertated members are normal members of a user group. They are
generated with a number as username, which you can change afterwards.
Create new user group Cancel
×


ADD MEMBERS

Automatically generated members

Automatically genertated members are normal members of a user group. They are
generated with a number as username, which you can change afterwards.
Add members Cancel
×


SHARE



OK
×


HALLO

Message to show
OK

×


OUTPUT OF YOUR PROGRAM


OK
×


FEEDBACK



RELEASE INFO

There are some changes for your robot! ×