The Raspberry Pi + OpenScan Pi Shield can be used to control two independent stepper motors and a variety of different cameras

Overview

OpenScan2

Overview:

The Raspberry Pi + OpenScan Pi Shield can be used to control two independent stepper motors and a variety of different cameras (Pi Camera, various Arducams, DSLR - via GPhoto and external Cameras like Smartphone and others). The mechanism can be used in various forms (see for example OpenScan Classic or OpenScan Mini and it could be easily adapted to be used as a camera slider or in other mechanisms. After sticking to my original code for way to long, I have spent a lot of time rewriting and re-organizing the whole code/structure/documentation and started this new repository. This should make it much easier to collaborate, implement future updates and continue exploring the wonderful world of 3d scanning :)

I have pre-compiled a working Raspbian Image (2022-04-22), that can be downloaded from Google Drive (1.5GB) (working flawlessly on Raspberry Pi 3b+. Need to re-install the camera drivers on Raspberry Pi 4!)

Changelog

2022-04-21

  • added: timer (ETA) until a routine is done
  • added: showing progress, while files are being split (before uploading to OpenScanCloud)
  • added: infotexts (FINALLY :)
  • added: several stats/device information
  • fixed: combining two sets did not delete the smaller set

2022-04-20

  • !fixed: pi cameras (v1.3, v2.1 and HQ) finally work and can be simply selected in the settings menu
  • !fixed: Raspberry Pi 3B+ and 4 work! (the main limiting factor now is the RAM, where at least 1GB RAM is needed)
  • fixed: live preview sometimes did not work. This has been a network speed issue and has been solved by downscaling the image (resolution can be set)
  • fixed: it is now possible to delete individual sets.
  • fixed: it is now possible to use all LEDs.
  • added: Turntable mode (disable the second axis)
  • added: Pause scan. You can pause and un-pause the scan by simply pressing the button
  • added: second scan pass. When one scan is done, you can immediately run a second pass. This is especially useful, if you want to re-orient the object
  • added: auto-timeout. Turn off the ringlight (todo: and motors) after 300 seconds (value can be set)
  • added: diskspace warning. When free diskspace drops below a given threshold (4GB by default), a warning message will appear
  • changed: new background image, minor design changes
  • changed: log file can be easily generated and downloaded by clicking a button (update&info tab)

Main Features:

  • use your Raspberry Pi to take very consistent image sets for photogrammetry (other use cases should be possible to ;)
  • use the included cloud processing function to automatically create highly detailed 3d models (see OpenScanCloud)
  • various supported camera modules:
    • standard Raspberry Pi Cameras (v1.3, v2.1 and HQ)
    • Arducam IMX 519 (with 16mp and autofocus)
    • and many other cameras through the libcamera framework
  • DSLRs:
    • many different models supported
    • preview and data acquisition via USB cable
    • see gphoto
    • and gphoto
    • for lists of the various models
  • triggering any camera through an isolated GPIO signal using a modified remote control

Pre-compiled Raspbian image

You can download a pre-compiled Raspbian image from Openscan.eu

Structure of this repository

Many free image datasets with additional information and discussion

  • datasets/
    • readme.md #todo

Several manuals on how to build/use/adjust the OpenScan devices, firmware and electronics

  • manual/
    • readme.md #todo
    • firmware-browserinterface.md #todo
    • firmware-backend.md #todo
    • object-preparation.md #todo

Providing the update files for the firmware, where the two .json files give a short summary of what changed

  • update/
    • update.json
    • beta/
    • main/

Setup

Prerequisites

It is necessary to use a Raspberry Pi with at least 1GB of RAM to run the firmware. This includes the Raspberry Pi model 2B, 3B, 3B+ and all 4B variants. The firmware and following installation guide is optimized for Raspbian Bullseye with Desktop environment, but can also be used headless (Note, that the desktop version comes with some libraries that you will otherwise need to install manually).

Raspi-config

sudo raspi-config

--> performance options --> GPU --> change to 256 Increase GPU memory, which helps processing the captured photos

--> localization settings --> wlan country --> your country Change the WLAN settings, so that device works in your area

Save and reboot now (or later ;)

Folder structure

Create directories

mkdir /home/pi/OpenScan/ /home/pi/OpenScan/scans /home/pi/OpenScan/files /home/pi/OpenScan/settings /home/pi/OpenScan/tmp /home/pi/OpenScan/updates

WLAN settings

Open the settings file

sudo nano /etc/network/interfaces

And add to the end:

auto wlan0
iface wlan0 inet manual
wpa-conf /etc/wpa_supplicant/wpa_supplicant.conf

Samba (optional but highly recommended)

Create a shared network drive, so that you can easily access the Raspberry Pi's filesystem. It enables you to upload custom datasets to the OpenScanCloud through the browser interface. Simply copy a zip file containing your photos to the ../OpenScan/scans directory.

Install the package

sudo apt-get install samba samba-common-bin

Open the configuration file

sudo nano /etc/samba/smb.conf

And change the following lines:

read only = no
create mask = 0775
directory mask = 0775

Add the following line, if you are using Windows:

wins support = yes

And add to the end of the file:

[PiShare]
comment=Raspberry Pi Share
path=/home/pi/
browseable=Yes
writeable=Yes
only guest=no
create mask=0777
directory mask=0777
public=yes

Set a password for user pi (by default I use password raspberry)

sudo smbpasswd -a pi

And add rights:

sudo chmod -R 777 /home/pi/OpenScan

Gphoto

Necessary to controll DSLR cameras connected by USB cable.

sudo apt install libgphoto2-dev gphoto2
sudo pip3 install -v gphoto2

NodeRed

Download and install:

bash <(curl -sL https://raw.githubusercontent.com/node-red/linux-installers/master/deb/update-nodejs-and-nodered)

--> confirm with yes and yes :)

Open node-red daemon file:

sudo nano /lib/systemd/system/nodered.service

add to the section [Unit]

Wants=network.target flask.service
After=flask.service

and change the following lines under [Service] to run nodered as root:

User = root
#Group = pi

Initialize node-red:

sudo node-red admin init

  • settings file: /root/.node-red/settings.js
  • Security: No
  • Project: No
  • Flows File Settings: Enter
  • Passphrase: Enter
  • Theme: default
  • Text editor: default
  • External Modules: Yes

Open node-red settings file:

sudo nano /root/.node-red/settings.js

And find, uncomment and change the following parameters:

userDir: '/home/pi/OpenScan/settings/.node-red/',

uiPort: process.env.PORT || 80,

httpAdminRoot: '/editor',

httpStatic: '/home/pi/OpenScan/',

ui: { path: "" },

functionGlobalContext: { // enables and pre-populates the context.global variable
    os:require('os'),
    path:require('path'),
    fs:require('fs')
    },

Enable nodered daemon and restart the device:

sudo systemctl enable nodered.service
sudo reboot -h

Open the node-red settings directory:

cd /home/pi/OpenScan/settings/.node-red/

And run the following command to install some additional palettes to node-red

sudo npm i node-red-dashboard && sudo npm i node-red-contrib-python3-function && sudo npm i node-red-node-ui-table

node-red-restart

Libcamera - to run Arducam IMX519 (and other non-Raspberry-Pi camera moduls)

See Arducam.com for more details

Download all necessary files

wget -O install_pivariety_pkgs.sh https://github.com/ArduCAM/Arducam-Pivariety-V4L2-Driver/releases/download/install_script/install_pivariety_pkgs.sh && chmod +x install_pivariety_pkgs.sh

sudo apt update

./install_pivariety_pkgs.sh -p libcamera_dev

./install_pivariety_pkgs.sh -p libcamera_apps

./install_pivariety_pkgs.sh -p imx519_kernel_driver

Download OpenScan Firmware

Custom node red flows (browser interface):

sudo wget https://raw.githubusercontent.com/OpenScanEu/OpenScan2/main/update/main/flows.json -O /home/pi/OpenScan/settings/.node-red/flows.json

Some Python functions used by the firmware:

sudo wget https://raw.githubusercontent.com/OpenScanEu/OpenScan2/main/update/main/OpenScan.py -O /usr/lib/python3/dist-packages/OpenScan.py

A local server providing several functions (flask):

sudo wget https://raw.githubusercontent.com/OpenScanEu/OpenScan2/main/update/main/fla.py -O /home/pi/OpenScan/files/fla.py

Custom config.txt file, which is needed to use different camera moduls (especially IMX519):

sudo wget https://raw.githubusercontent.com/OpenScanEu/OpenScan2/main/update/main/config.txt -O /boot/config.txt

Arducam's camera focus script for the IMX519 sensor:

sudo wget https://raw.githubusercontent.com/OpenScanEu/OpenScan2/main/update/main/Arducam.py -O /usr/lib/python3/dist-packages/Arducam.py

And the OpenScan Logo to have a nice background:

sudo wget https://raw.githubusercontent.com/OpenScanEu/OpenScan2/main/update/files/logo.jpg -O /home/pi/OpenScan/files/logo.jpg

Enable Flask local server:

create and open the service file: sudo nano /lib/systemd/system/flask.service

with the following content:

[Unit]
Description=photo service
After=multi-user.target
[Service]
#ExecStartPre=/bin/sleep 5
ExecStart=/usr/bin/python3 /home/pi/OpenScan/files/fla.py
StandardOutput=inherit
StandardError=inherit
Restart=always
RestartSec=5
User=root
[Install]
WantedBy=multi-user.target

Enable and start the service:

sudo systemctl daemon-reload && sudo systemctl enable flask.service && sudo systemctl start flask.service

others

add to /boot/config.txt to disable display which causes some issues --> WHY???

hdmi_blanking=2

Comments
  • Could not verify token

    Could not verify token

    I input the token emailed to me. After a long delay a window pops up and says could not verify.

    I tried the windows uploader too and it just stays loading.

    opened by s13t0ttz 13
  • Arducam 16mp on raspberry pi4 not working

    Arducam 16mp on raspberry pi4 not working

    I followed the instructions here: https://en.openscan.eu/post/beta-firmware-imx519-16mpx-autofocus-dslr-finally-1 and it didn't show an image on the Scan screen despite reporting "--READY--"

    As requested here's the output of trying to capture an image from the command-line:

    pi@openscan:~/OpenScan/tmp $ libcamera-still -n -t 1000 -o test.jpg --autofocus
    [0:05:16.705895461] [1012]  INFO Camera camera_manager.cpp:293 libcamera v0.0.0
    [0:05:16.819083126] [1014]  WARN CameraSensorProperties camera_sensor_properties.cpp:141 No static properties available for 'imx519'
    [0:05:16.819271807] [1014]  WARN CameraSensorProperties camera_sensor_properties.cpp:143 Please consider updating the camera sensor properties database
    [0:05:16.969493427] [1014] ERROR DelayedControls delayed_controls.cpp:87 Delay request for control id 0x009a090a but control is not exposed by device /dev/video0
    [0:05:16.969626053] [1014] ERROR DelayedControls delayed_controls.cpp:87 Delay request for control id 0x009e0901 but control is not exposed by device /dev/video0
    [0:05:16.969704959] [1014] ERROR DelayedControls delayed_controls.cpp:87 Delay request for control id 0x00980911 but control is not exposed by device /dev/video0
    [0:05:16.969817938] [1014] ERROR DelayedControls delayed_controls.cpp:87 Delay request for control id 0x009e0903 but control is not exposed by device /dev/video0
    [0:05:16.974238252] [1012]  INFO Camera camera.cpp:937 configuring streams: (0) 2328x1748-YUV420
    [0:05:16.975390686] [1014]  INFO RPI raspberrypi.cpp:122 Mode: 2328x1748 fmt Y10  Score: 500 (best 500)
    [0:05:16.975540645] [1014]  INFO RPI raspberrypi.cpp:122 Mode: 2328x1748 fmt Y12  Score: 500 (best 500)
    [0:05:16.975659772] [1014]  INFO RPI raspberrypi.cpp:122 Mode: 2328x1748 fmt Y14  Score: 500 (best 500)
    [0:05:16.975903932] [1014]  INFO RPI raspberrypi.cpp:122 Mode: 2328x1748 fmt BA10 Score: 1500 (best 500)
    [0:05:16.976030262] [1014]  INFO RPI raspberrypi.cpp:122 Mode: 2328x1748 fmt GB10 Score: 1500 (best 500)
    [0:05:16.976161815] [1014]  INFO RPI raspberrypi.cpp:122 Mode: 2328x1748 fmt BG10 Score: 1500 (best 500)
    [0:05:16.976325459] [1014]  INFO RPI raspberrypi.cpp:122 Mode: 2328x1748 fmt RG10 Score: 1500 (best 500)
    [0:05:16.976410845] [1014]  INFO RPI raspberrypi.cpp:122 Mode: 2328x1748 fmt BA81 Score: 2500 (best 500)
    [0:05:16.976493677] [1014]  INFO RPI raspberrypi.cpp:122 Mode: 2328x1748 fmt BA12 Score: 500 (best 500)
    [0:05:16.976575452] [1014]  INFO RPI raspberrypi.cpp:122 Mode: 2328x1748 fmt GB12 Score: 500 (best 500)
    [0:05:16.976656524] [1014]  INFO RPI raspberrypi.cpp:122 Mode: 2328x1748 fmt BG12 Score: 500 (best 500)
    [0:05:16.976738226] [1014]  INFO RPI raspberrypi.cpp:122 Mode: 2328x1748 fmt RG12 Score: 500 (best 500)
    [0:05:16.976820928] [1014]  INFO RPI raspberrypi.cpp:122 Mode: 2328x1748 fmt RGB3 Score: 500 (best 500)
    [0:05:16.976904000] [1014]  INFO RPI raspberrypi.cpp:122 Mode: 2328x1748 fmt BGR3 Score: 500 (best 500)
    [0:05:16.976989479] [1014]  INFO RPI raspberrypi.cpp:122 Mode: 2328x1748 fmt GB14 Score: 500 (best 500)
    [0:05:16.977074699] [1014]  INFO RPI raspberrypi.cpp:122 Mode: 2328x1748 fmt BG14 Score: 500 (best 500)
    [0:05:16.977159512] [1014]  INFO RPI raspberrypi.cpp:122 Mode: 2328x1748 fmt RG14 Score: 500 (best 500)
    [0:05:16.977244102] [1014]  INFO RPI raspberrypi.cpp:122 Mode: 2328x1748 fmt GR14 Score: 500 (best 500)
    [0:05:16.977328193] [1014]  INFO RPI raspberrypi.cpp:122 Mode: 2328x1748 fmt RGB4 Score: 500 (best 500)
    [0:05:16.977406820] [1014]  INFO RPI raspberrypi.cpp:122 Mode: 2328x1748 fmt pBAA Score: 1000 (best 500)
    [0:05:16.977486207] [1014]  INFO RPI raspberrypi.cpp:122 Mode: 2328x1748 fmt pGAA Score: 1000 (best 500)
    [0:05:16.977566187] [1014]  INFO RPI raspberrypi.cpp:122 Mode: 2328x1748 fmt pRAA Score: 1000 (best 500)
    [0:05:16.977644018] [1014]  INFO RPI raspberrypi.cpp:122 Mode: 2328x1748 fmt pgAA Score: 1000 (best 500)
    [0:05:16.977727997] [1014]  INFO RPI raspberrypi.cpp:122 Mode: 2328x1748 fmt RGGB Score: 2500 (best 500)
    [0:05:16.977808477] [1014]  INFO RPI raspberrypi.cpp:122 Mode: 2328x1748 fmt pBCC Score: 0 (best 0)
    [0:05:16.977888271] [1014]  INFO RPI raspberrypi.cpp:122 Mode: 2328x1748 fmt pGCC Score: 0 (best 0)
    [0:05:16.977969139] [1014]  INFO RPI raspberrypi.cpp:122 Mode: 2328x1748 fmt pRCC Score: 0 (best 0)
    [0:05:16.978048637] [1014]  INFO RPI raspberrypi.cpp:122 Mode: 2328x1748 fmt pgCC Score: 0 (best 0)
    [0:05:16.978132617] [1014]  INFO RPI raspberrypi.cpp:122 Mode: 2328x1748 fmt pBEE Score: 500 (best 0)
    [0:05:16.978217226] [1014]  INFO RPI raspberrypi.cpp:122 Mode: 2328x1748 fmt pGEE Score: 500 (best 0)
    [0:05:16.978301076] [1014]  INFO RPI raspberrypi.cpp:122 Mode: 2328x1748 fmt pREE Score: 500 (best 0)
    [0:05:16.978384999] [1014]  INFO RPI raspberrypi.cpp:122 Mode: 2328x1748 fmt pgEE Score: 500 (best 0)
    [0:05:16.978468071] [1014]  INFO RPI raspberrypi.cpp:122 Mode: 2328x1748 fmt GRBG Score: 2500 (best 0)
    [0:05:16.978553125] [1014]  INFO RPI raspberrypi.cpp:122 Mode: 2328x1748 fmt GBRG Score: 2500 (best 0)
    [0:05:16.978637882] [1014]  INFO RPI raspberrypi.cpp:122 Mode: 2328x1748 fmt RGBO Score: 500 (best 0)
    [0:05:16.978721843] [1014]  INFO RPI raspberrypi.cpp:122 Mode: 2328x1748 fmt Y10P Score: 500 (best 0)
    [0:05:16.978805859] [1014]  INFO RPI raspberrypi.cpp:122 Mode: 2328x1748 fmt Y12P Score: 500 (best 0)
    [0:05:16.978889801] [1014]  INFO RPI raspberrypi.cpp:122 Mode: 2328x1748 fmt Y14P Score: 500 (best 0)
    [0:05:16.978971299] [1014]  INFO RPI raspberrypi.cpp:122 Mode: 2328x1748 fmt RGBP Score: 500 (best 0)
    [0:05:16.979054834] [1014]  INFO RPI raspberrypi.cpp:122 Mode: 2328x1748 fmt RGBQ Score: 500 (best 0)
    [0:05:16.979138554] [1014]  INFO RPI raspberrypi.cpp:122 Mode: 2328x1748 fmt RGBR Score: 500 (best 0)
    [0:05:16.979222275] [1014]  INFO RPI raspberrypi.cpp:122 Mode: 2328x1748 fmt YVYU Score: 500 (best 0)
    [0:05:16.979306939] [1014]  INFO RPI raspberrypi.cpp:122 Mode: 2328x1748 fmt YUYV Score: 500 (best 0)
    [0:05:16.979384511] [1014]  INFO RPI raspberrypi.cpp:122 Mode: 2328x1748 fmt GREY Score: 2500 (best 0)
    [0:05:16.979691596] [1014]  INFO RPI raspberrypi.cpp:122 Mode: 2328x1748 fmt VYUY Score: 500 (best 0)
    [0:05:16.979769705] [1014]  INFO RPI raspberrypi.cpp:122 Mode: 2328x1748 fmt UYVY Score: 500 (best 0)
    [0:05:16.980242230] [1014]  INFO RPI raspberrypi.cpp:624 Sensor: /base/soc/i2c0mux/i2c@1/imx519@1a - Selected mode: 2328x1748-pgCC
    [0:05:16.982413083] [1014] ERROR IPARPI raspberrypi.cpp:567 Unable to find sensor control 0x009e0903
    [0:05:16.982541154] [1014] ERROR IPARPI raspberrypi.cpp:376 Sensor control validation failed.
    [0:05:16.982612189] [1014] ERROR RPI raspberrypi.cpp:1353 IPA configuration failed!
    [0:05:16.982760334] [1014] ERROR RPI raspberrypi.cpp:761 Failed to configure the IPA: -32
    [0:05:17.012504103] [1014] ERROR V4L2 v4l2_videodevice.cpp:1158 /dev/video1[13:cap]: Unable to request 4 buffers: Invalid argument
    [0:05:17.012591823] [1014] ERROR RPI raspberrypi.cpp:821 Failed to allocate buffers
    
    opened by aharbick 11
  • Issue: Cant Connect to scanner

    Issue: Cant Connect to scanner

    Hey,

    Just ran in to an issue with my OpenScan Mini

    It had been working fine for ages...until one day, it stopped connecting. I have tried the following

    1. Connecting via ethernet and typing in http://openscan/ - result is, "This site cannot be reached"
    2. tried reformatting the SD card and burning the new image and the WPA Supplicant with all prior working data included - result Angry IP Scanner cannot detect the scanner over the Wi-Fi

    What is going on? it was working just fine, then "poof!!" stopped working....this is a real mystery to me, please help

    opened by OpenScanFan 10
  • Issue: Turntable, turning in random directions

    Issue: Turntable, turning in random directions

    Hey, hope someone can help with this one When scanning, the turntable does not turn in equal distances, it just jumps all over the show Any reason for this?

    Sample alignment results showing camera positions Turntable_Issue

    opened by OpenScanFan 8
  • Automatic operation of the ringlight

    Automatic operation of the ringlight

    I think it would be nice to have an option for the ringlight to turn off automatically after the job is finished. What I mean is - if you leave the scanner working at night it won't keep the ringlight turned on forever but it will turn it off as soon as the job is finished (and turn it on as soon as a new job is started). To implement this I have added a few new nodes: image

    Here is the json of the above blocks
    [
        {
            "id": "8ebd1dcb5db156ed",
            "type": "ui_text",
            "z": "1613373abaf77a2c",
            "group": "7aaf184330605300",
            "order": 2,
            "width": 6,
            "height": 1,
            "name": "",
            "label": "Current Status:",
            "format": "<font color= {{msg.color}} > {{msg.payload}} </font>",
            "layout": "row-spread",
            "className": "",
            "x": 320,
            "y": 160,
            "wires": []
        },
        {
            "id": "94a7aec739f9266b",
            "type": "function",
            "z": "1613373abaf77a2c",
            "name": "loadS",
            "func": "var file = 'status_internal_cam'\nlet fs = global.get('fs');\nvar filepath = '/home/pi/OpenScan/settings/';\nconst data = fs.readFileSync(filepath+file, 'utf8');\nmsg.payload = String(data);\n\nif (data === 'no camera found'){\n    msg.color = 'red'\n}\n\nreturn msg\n\n",
            "outputs": 1,
            "noerr": 0,
            "initialize": "",
            "finalize": "",
            "libs": [],
            "x": 170,
            "y": 160,
            "wires": [
                [
                    "8ebd1dcb5db156ed",
                    "b87aecd9dc7f94b1"
                ]
            ]
        },
        {
            "id": "2415272f42ce468c",
            "type": "link in",
            "z": "1613373abaf77a2c",
            "name": "start status",
            "links": [
                "6c6ef2255a7d39e5"
            ],
            "x": 55,
            "y": 160,
            "wires": [
                [
                    "94a7aec739f9266b"
                ]
            ]
        },
        {
            "id": "0ad3d8cfcb22472b",
            "type": "ui_switch",
            "z": "1613373abaf77a2c",
            "name": "",
            "label": "Ringlight test",
            "tooltip": "",
            "group": "7aaf184330605300",
            "order": 13,
            "width": 0,
            "height": 0,
            "passthru": true,
            "decouple": "false",
            "topic": "topic",
            "topicType": "msg",
            "style": "",
            "onvalue": "1",
            "onvalueType": "num",
            "onicon": "",
            "oncolor": "",
            "offvalue": "0",
            "offvalueType": "num",
            "officon": "",
            "offcolor": "",
            "animate": false,
            "className": "",
            "x": 770,
            "y": 260,
            "wires": [
                [
                    "863f97875fd752de"
                ]
            ]
        },
        {
            "id": "b87aecd9dc7f94b1",
            "type": "switch",
            "z": "1613373abaf77a2c",
            "name": "",
            "property": "payload",
            "propertyType": "msg",
            "rules": [
                {
                    "t": "eq",
                    "v": "--READY--",
                    "vt": "str"
                },
                {
                    "t": "neq",
                    "v": "--READY--",
                    "vt": "str"
                }
            ],
            "checkall": "true",
            "repair": false,
            "outputs": 2,
            "x": 290,
            "y": 200,
            "wires": [
                [
                    "8c130831504887e3"
                ],
                [
                    "21cdfb2315d39b6c",
                    "a6b9dba90e2abab7"
                ]
            ]
        },
        {
            "id": "21cdfb2315d39b6c",
            "type": "change",
            "z": "1613373abaf77a2c",
            "name": "",
            "rules": [
                {
                    "t": "set",
                    "p": "ringlight",
                    "pt": "flow",
                    "to": "ringlightSlider",
                    "tot": "flow"
                }
            ],
            "action": "",
            "property": "",
            "from": "",
            "to": "",
            "reg": false,
            "x": 560,
            "y": 220,
            "wires": [
                []
            ]
        },
        {
            "id": "8c130831504887e3",
            "type": "change",
            "z": "1613373abaf77a2c",
            "name": "",
            "rules": [
                {
                    "t": "set",
                    "p": "ringlight",
                    "pt": "flow",
                    "to": "ringlightSliderTest",
                    "tot": "flow"
                }
            ],
            "action": "",
            "property": "",
            "from": "",
            "to": "",
            "reg": false,
            "x": 560,
            "y": 180,
            "wires": [
                []
            ]
        },
        {
            "id": "863f97875fd752de",
            "type": "change",
            "z": "1613373abaf77a2c",
            "name": "",
            "rules": [
                {
                    "t": "set",
                    "p": "ringlightSwitch",
                    "pt": "flow",
                    "to": "payload",
                    "tot": "msg"
                }
            ],
            "action": "",
            "property": "",
            "from": "",
            "to": "",
            "reg": false,
            "x": 980,
            "y": 260,
            "wires": [
                []
            ]
        },
        {
            "id": "a6b9dba90e2abab7",
            "type": "function",
            "z": "1613373abaf77a2c",
            "name": "",
            "func": "msg.payload = 0\nreturn msg;",
            "outputs": 1,
            "noerr": 0,
            "initialize": "",
            "finalize": "",
            "libs": [],
            "x": 540,
            "y": 260,
            "wires": [
                [
                    "0ad3d8cfcb22472b"
                ]
            ]
        },
        {
            "id": "7aaf184330605300",
            "type": "ui_group",
            "name": "Settings",
            "tab": "e23b837a9f040895",
            "order": 1,
            "disp": false,
            "width": "6",
            "collapse": false,
            "className": ""
        },
        {
            "id": "e23b837a9f040895",
            "type": "ui_tab",
            "name": "Scan",
            "icon": "dashboard",
            "order": 2,
            "disabled": false,
            "hidden": false
        }
    ]
    

    and also: image

    Here is the json code
    [
        {
            "id": "4970d029a12015f6",
            "type": "python3-function",
            "z": "1613373abaf77a2c",
            "name": "LED",
            "func": "from OpenScan import ringlight\ntry:\n    val = msg['payload']\nexcept:\n    val = 0\n\nif val == 0:\n    ringlight(1,False)\n    ringlight(2,False)\nelif val == 1:\n    ringlight(1,False)\n    ringlight(2,True)\nelif val == 2:\n    ringlight(1,True)\n    ringlight(2,False)\nelif val == 3:\n    ringlight(1,True)\n    ringlight(2,True)\n",
            "outputs": 1,
            "x": 390,
            "y": 920,
            "wires": [
                [
                    "6a33bdfe5ee85fb9"
                ]
            ]
        },
        {
            "id": "6a33bdfe5ee85fb9",
            "type": "ui_text",
            "z": "1613373abaf77a2c",
            "group": "7aaf184330605300",
            "order": 11,
            "width": 3,
            "height": 1,
            "name": "ringlight",
            "label": "Ringlight",
            "format": "",
            "layout": "row-left",
            "className": "",
            "x": 560,
            "y": 920,
            "wires": []
        },
        {
            "id": "733d276024f1d8d8",
            "type": "change",
            "z": "1613373abaf77a2c",
            "name": "",
            "rules": [
                {
                    "t": "set",
                    "p": "payload",
                    "pt": "msg",
                    "to": "ringlight",
                    "tot": "flow"
                }
            ],
            "action": "",
            "property": "",
            "from": "",
            "to": "",
            "reg": false,
            "x": 220,
            "y": 920,
            "wires": [
                [
                    "4970d029a12015f6"
                ]
            ]
        },
        {
            "id": "830b9b27e1ad18ce",
            "type": "link in",
            "z": "1613373abaf77a2c",
            "name": "",
            "links": [
                "6c6ef2255a7d39e5"
            ],
            "x": 55,
            "y": 800,
            "wires": [
                [
                    "733d276024f1d8d8",
                    "7a7047582588f864"
                ]
            ]
        },
        {
            "id": "7a7047582588f864",
            "type": "switch",
            "z": "1613373abaf77a2c",
            "name": "",
            "property": "ringlightSwitch",
            "propertyType": "flow",
            "rules": [
                {
                    "t": "eq",
                    "v": "0",
                    "vt": "num"
                },
                {
                    "t": "eq",
                    "v": "1",
                    "vt": "num"
                }
            ],
            "checkall": "true",
            "repair": false,
            "outputs": 2,
            "x": 190,
            "y": 840,
            "wires": [
                [
                    "817035da9995ec07"
                ],
                [
                    "3520bcf2c4b51af9"
                ]
            ]
        },
        {
            "id": "817035da9995ec07",
            "type": "change",
            "z": "1613373abaf77a2c",
            "name": "",
            "rules": [
                {
                    "t": "set",
                    "p": "ringlightSliderTest",
                    "pt": "flow",
                    "to": "0",
                    "tot": "num"
                }
            ],
            "action": "",
            "property": "",
            "from": "",
            "to": "",
            "reg": false,
            "x": 390,
            "y": 800,
            "wires": [
                []
            ]
        },
        {
            "id": "3520bcf2c4b51af9",
            "type": "change",
            "z": "1613373abaf77a2c",
            "name": "",
            "rules": [
                {
                    "t": "set",
                    "p": "ringlightSliderTest",
                    "pt": "flow",
                    "to": "ringlightSlider",
                    "tot": "flow"
                }
            ],
            "action": "",
            "property": "",
            "from": "",
            "to": "",
            "reg": false,
            "x": 390,
            "y": 860,
            "wires": [
                []
            ]
        },
        {
            "id": "4dd7285c2b0fd79b",
            "type": "ui_slider",
            "z": "1613373abaf77a2c",
            "name": "ringlight",
            "label": "",
            "tooltip": "",
            "group": "7aaf184330605300",
            "order": 12,
            "width": 3,
            "height": 1,
            "passthru": true,
            "outs": "all",
            "topic": "",
            "topicType": "str",
            "min": 0,
            "max": "3",
            "step": 1,
            "className": "",
            "x": 320,
            "y": 700,
            "wires": [
                [
                    "207caa543304bd9f"
                ]
            ]
        },
        {
            "id": "207caa543304bd9f",
            "type": "change",
            "z": "1613373abaf77a2c",
            "name": "",
            "rules": [
                {
                    "t": "set",
                    "p": "ringlightSlider",
                    "pt": "flow",
                    "to": "payload",
                    "tot": "msg"
                }
            ],
            "action": "",
            "property": "",
            "from": "",
            "to": "",
            "reg": false,
            "x": 560,
            "y": 700,
            "wires": [
                []
            ]
        },
        {
            "id": "7aaf184330605300",
            "type": "ui_group",
            "name": "Settings",
            "tab": "e23b837a9f040895",
            "order": 1,
            "disp": false,
            "width": "6",
            "collapse": false,
            "className": ""
        },
        {
            "id": "e23b837a9f040895",
            "type": "ui_tab",
            "name": "Scan",
            "icon": "dashboard",
            "order": 2,
            "disabled": false,
            "hidden": false
        }
    ]
    

    There is a new button on the Scan page: "ringlight test" - switching it will turn on the ringlight even if the scanner is in "ready" state. The button will be turned off when a job is started so the ringlight will turn off after the job is finished. The set value of ringlight slider remains unchanged.

    As the changes are a bit extensive I decided to fork OS to my github and I'll create a pull request soon, which will contain solution to this issue and also #16 and #17

    opened by sokol07 8
  • DOWNLOAD does not work

    DOWNLOAD does not work

    Hi

    The download button in Files & Cloud is broken. It seems to populate the URL from the list, and not just the filename. It gives a horrible reply:

    Cannot GET /%7B%22Set%22:%222022-02-07_20.36.08-89745.zip%22,%22Photos%22:100,%22Size%22:%22217.5MB%22,%22Date%22:%222022-02-07_20.36%22,%22Name%22:%2289745%22,%22Status%22:%22prepared%22,%22Size_full%22:217589003,%22id%22:4%7D

    Cheers

    MC

    opened by mcbriers 8
  • Feature Request: Timer

    Feature Request: Timer

    I recently realized it would be really handy to have a time duration and time remaining for the scan its because I need to plan my day(s) around scan times, I scan all day everyday

    Also maybe a total time duration next to the saved file name?

    opened by OpenScanFan 7
  • Issue: The device or resource (openscan) is not set up to accept connections on port

    Issue: The device or resource (openscan) is not set up to accept connections on port "The World Wide Web service (HTTP)

    This has been driving up the wall and around the block, I have tried EVERYTHING to get this to work

    Cant access the scanner via browser It worked before, now just doesn't show up anymore... Any idea what the issue is Untitled ?

    opened by OpenScanFan 7
  • Update flows.json - addressing issues #16, #17, #19, #24, #27

    Update flows.json - addressing issues #16, #17, #19, #24, #27

    Modified flows to solve below problems:

    1. Ringlight slider didn't have setting to light up all LEDs (issue #16 )
    2. Problem with selected set deletion (issue #17 )
    3. Updated functionality of the ringlight (issue #19 )
    opened by sokol07 7
  • Impossible to light up all leds

    Impossible to light up all leds

    Hi, In the newest software version of OpenScan (beta for classic with arducam) it is impossible to turn on both LEDs at the same time. Is it a matter of heat dissipation or power consumption? If not, it can be easily solved in nodered by modifying the ringlight slider: image and consecutive code piece: image

    opened by sokol07 5
  • needs autofocus targeting

    needs autofocus targeting

    the arducam is great because it has autofocus but it does sometimes focus on things in the distance. like the other side of the ring on my mini or something through the gap. is there a way to fix this as it mostly happens at the start of the scan.

    opened by jank0cisco 4
  • EXIF data

    EXIF data

    Many apps like MESHROOM require camera data such as focal length and sensor size via embedded EXIF data in order to triangulate correctly. The images sent by the scanner do not have EXIF

    opened by jope89 0
  • Patch Focuser to latest version

    Patch Focuser to latest version

    Latest version (Don't know if it's Linux Kernel, Arducam libs or what) broke compatibility.

    Just updating Arducam.py with the latest Focuser example bundled with Arducam Kernel Driver.

    opened by jorgerobles 0
  • [Feature Request] No zip project files and specify output folder options for remote drives

    [Feature Request] No zip project files and specify output folder options for remote drives

    Using zip files is a SD intensive task, and prevents the use of virtual drives.

    Adding a way to just save the spare files in a custom folder will allow to just upload to any remote drive (as provided with RCLONE) solving both space and SD hammering.

    opened by jorgerobles 0
  • [Feature Request] Make preview on-demand

    [Feature Request] Make preview on-demand

    Actually, the preview is a background-driven task, just launching node-red service starts to hammer the SD-card. Besides Ram-disk solutions, previewing thru client side (front asks the preview) will minimize this issue, as if there's no front asking, no preview will be made.

    opened by jorgerobles 0
  • [Suggestion] Move inline python nodes to files

    [Suggestion] Move inline python nodes to files

    Trying to debug Openscan failures is hard (a nightmare), mainly due inline scripting.

    Maybe using this extension makes a better way to edit, isolate and debug. https://flows.nodered.org/node/node-red-contrib-pythonshell

    opened by jorgerobles 0
  • Arducam 0.1.0 breaks compatibility

    Arducam 0.1.0 breaks compatibility

    The signature of Arducam libcamera-still have changed from 0.9.0 to 0.10.0, throwing an error while trying to focus.

    Fresh install using build instructions means manual focus / stacking is not usable, thus application shuts down.

    opened by jorgerobles 0
Owner
Thomas
Thomas
Chrome extension that uses vulnerabilities CVE-2021-33044 and CVE-2021-33045 to log in to Dahua cameras without authentication.

DahuaLoginBypass Chrome extension that uses vulnerability CVE-2021-33044 to log in to Dahua IP cameras and VTH/VTO (video intercom) devices without au

null 71 Nov 26, 2022
Shield is a development framework for circom developers. The core reason is to provide libraries, plugins, and testing tools to ensure code quality and security.

SHIELD Shield is a development framework for circom developers but we plan it to other languages such as CAIRO, SNARKYJS etc. The core reason is to pr

Xord 41 Dec 22, 2022
This repository contains different infrastructure components that are used in different projects here at NaN Labs.

Infrastructure Reference Changelog | Contributing This repository contains different infrastructure components that are used in different projects her

NaN Labs 10 Dec 15, 2022
Block Ad-Shield advertisement and anti-adblock

microShield microShield blocks Ad-Shield advertisement and anti-adblock script. Quick Start Just click the following URL to detect this userscript. ht

null 25 Dec 20, 2022
The Guard helps developers shield the details of the underlying authentication and tedious UI development

The Guard helps developers shield the details of the underlying authentication and tedious UI development. It enables enterprises and developers to quickly launch a secure, customizable UI unified login form.

Authing 1.7k Dec 19, 2022
Prisma +2 generator to emit a tRPC shield from your Prisma schema

Prisma tRPC Shield Generator Automatically generate a tRPC Shield from your Prisma Schema. Updates every time npx prisma generate runs. Table of Conte

Omar Dulaimi 27 Dec 24, 2022
Lightweight and independent Pinterest-like cascading grid layout library

Bricklayer is a Lightweight and Independent Pinterest-like Cascading Grid Layout Library ?? Simpler than any other cascading grid layout tools. ❄️ Lig

Adem ilter 2.5k Dec 22, 2022
JavaScript image gallery for mobile and desktop, modular, framework independent

PhotoSwipe v5 — JavaScript image gallery and lightbox Demo | Documentation Repo structure dist/ - main JS and CSS src/ - source JS and CSS. src/js/pho

Dmytro Semenov 22.4k Dec 29, 2022
Kyrillos Hany 14 Aug 10, 2022
microregex is an open source and highly curated catalog of regular expression patterns. It offers programmers RegEx snippets that can be quickly exported into a variety of programming languages and distributed around teams.

microregex - A catalog of RegEx patterns View Demo · Report Bug · Request Feature Loved the tool? Please consider contributing ✍️ to help it improve!

Sunit Shirke 4 Oct 25, 2022
"Choose your Pokemon" is a Webpack project meant to fetch data from two different APIs: PokéAPI and Involvement API

"Choose your Pokemon" is a Webpack project meant to fetch data from two different APIs: PokéAPI and Involvement API. Here we display a list of 20 Pokemons for whom one can like, display more info, and comment; all based on the data from these two external resources.

Carlos HerverSolano 19 Mar 31, 2022
An open-source boat display cockpit for navigation, speed, heading, and tide tables running on Raspberry Pi and accessible as a webapp through any smartphone.

An open-source boat display cockpit for navigation, speed, heading, and tide tables running on Raspberry Pi and accessible as a webapp through any smartphone

Andy 44 Dec 30, 2022
A status monitor for Elite Dangerous, written in PHP. Designed for 1080p screens in the four-panel-view in panel.php, and for 7 inch screens with a resolution of 1024x600 connected to a Raspberry Pi.

EDStatusPanel A status monitor for Elite Dangerous, written in PHP. Designed for 1080p screens in the four-panel-view in panel.php, and for 7 inch scr

marcus-s 24 Oct 4, 2022
A three.js and roslibjs powered web-control for zju fast-drone-250 for laptop-free flight control

Web Control for ZJU Fast-Drone-250 A three.js and roslibjs powered web-control for zju fast-drone-250 for laptop-free flight control (tested on Xiaomi

null 6 Nov 11, 2022
This OctoPrint plugin allows to check the Raspberry GPIO status.

GPIO Status This OctoPrint plugin allows to check the GPIO status by the web interface, without the need to connect via SSH. It also permits knowing s

Daniele Borgo 6 Mar 17, 2022
TS Deno Interface to help communicate with the raspberry pi's GPIO pins

Raspberry pi GPIO helpers made for Deno An interface for interacting and reading from the raspberry pi GPIO pins using sysfs. Why? Just for shits and

Duart Snel 4 Dec 21, 2022
An implementation of the ECMA-419 spec on the Raspberry Pi

raspi-419 An implementation of the ECMA-419 spec on the Raspberry Pi Licsense MIT License Copyright (c) Bryan Hughes Permission is hereby granted, fre

Bryan Hughes 4 Jun 9, 2022