No caso, porque não é necessário criar o objeto na função insereProduto()? Estilo:
function insereProduto($conexao, Produto $produto){
$produto = new Produto();
$nome = mysqli_real_escape_string($conexao, $produto->nome);
$query = "insert into produtos (nome,preco,descricao,categoria_id,usado)
values('{$produto->nome}',{$produto->preco},'{$produto->descricao}',
{$produto->categoria_id},{$produto->usado})";
return mysqli_query($conexao,$query);
}
pois se eu chamar essa função em outro arquivo, eu vou ter que criar esse objeto toda hora, não seria melhor só criar ele na própria função?